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

Artifact 1dcd863d151c39b8f4b7eba3e2eb04366f0493fe0b54f54f64fb8115f749e895:


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: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0860: 4e 54 48 52 45 53 48 4f 4c 44 0a 23 20 20 64 65  NTHRESHOLD.#  de
0870: 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 54 48  fine NTDDI_WINTH
0880: 52 45 53 48 4f 4c 44 20 20 20 20 20 20 20 20 20  RESHOLD         
0890: 20 20 20 20 20 20 20 30 78 30 36 30 34 30 30 30         0x0604000
08a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
08b0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
08c0: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78  the GetVersionEx
08d0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61  [AW] functions a
08e0: 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f 6e  re deprecated on
08f0: 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 73   the.** target s
0900: 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73 69  ystem.  GetVersi
0910: 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20 64  onEx was first d
0920: 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69 6e  eprecated in Win
0930: 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  8.1..*/.#ifndef 
0940: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0950: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0960: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0970: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0980: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0990: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
09a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69   0   /* GetVersi
09d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63  onEx() is deprec
09e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a  ated */.#  else.
09f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0a00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
0a10: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47  IONEX   1   /* G
0a20: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73  etVersionEx() is
0a30: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65   current */.#  e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0a50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0a60: 69 66 20 74 68 65 20 43 72 65 61 74 65 46 69 6c  if the CreateFil
0a70: 65 4d 61 70 70 69 6e 67 41 20 66 75 6e 63 74 69  eMappingA functi
0a80: 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  on is supported 
0a90: 6f 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  on the.** target
0aa0: 20 73 79 73 74 65 6d 2e 20 20 49 74 20 69 73 20   system.  It is 
0ab0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  unavailable when
0ac0: 20 75 73 69 6e 67 20 22 6d 69 6e 63 6f 72 65 2e   using "mincore.
0ad0: 6c 69 62 22 20 6f 6e 20 57 69 6e 31 30 2e 0a 2a  lib" on Win10..*
0ae0: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0af0: 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 31 30 2c   for Windows 10,
0b00: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 22   always assume "
0b10: 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20 69 73 20  mincore.lib" is 
0b20: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  in use..*/.#ifnd
0b30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0b40: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0b50: 47 41 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  GA.#  if defined
0b60: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20  (NTDDI_VERSION) 
0b70: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  && NTDDI_VERSION
0b80: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 54 48 52   >= NTDDI_WINTHR
0b90: 45 53 48 4f 4c 44 0a 23 20 20 20 20 64 65 66 69  ESHOLD.#    defi
0ba0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0bb0: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0bc0: 47 41 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  GA   0.#  else.#
0bd0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0be0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
0bf0: 4c 45 4d 41 50 50 49 4e 47 41 20 20 20 31 0a 23  LEMAPPINGA   1.#
0c00: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0c20: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ant should alrea
0c30: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69  dy be defined (i
0c40: 6e 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22  n the "WinDef.h"
0c50: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23   SDK file)..*/.#
0c60: 69 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a  ifndef MAX_PATH.
0c70: 23 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  #  define MAX_PA
0c80: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
0c90: 20 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65          (260).#e
0ca0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0cb0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0cc0: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0cd0: 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20  or Win32.  This 
0ce0: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0cf0: 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a  be.** MAX_PATH..
0d00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0d10: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d20: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0d30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d40: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28  X_PATH_CHARS   (
0d50: 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66  MAX_PATH).#endif
0d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e  ../*.** This con
0d70: 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72  stant should alr
0d80: 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20  eady be defined 
0d90: 28 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68  (in the "WinNT.h
0da0: 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a  " SDK file)..*/.
0db0: 23 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f  #ifndef UNICODE_
0dc0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0dd0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f  .#  define UNICO
0de0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0df0: 41 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29  ARS      (32767)
0e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0e10: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0e20: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0e30: 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68  ) for WinNT.  Th
0e40: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0e50: 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45  ly be.** UNICODE
0e60: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0e70: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  S..*/.#ifndef SQ
0e80: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0e90: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0ea0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  ine SQLITE_WINNT
0eb0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0ec0: 20 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e    (UNICODE_STRIN
0ed0: 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e  G_MAX_CHARS).#en
0ee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0ef0: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0f00: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0f10: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0f20: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0f30: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0f40: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0f50: 20 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61   4 bytes per cha
0f60: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
0f70: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
0f80: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
0f90: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
0fa0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0fb0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0fc0: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0fd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0fe0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0ff0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
1000: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
1010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1020: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
1030: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
1040: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
1050: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1060: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f  y be.** UNICODE_
1070: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
1080: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
1090: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10a0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
10b0: 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69  TH_BYTES.#  defi
10c0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ne SQLITE_WINNT_
10d0: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20  MAX_PATH_BYTES  
10e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1100: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20  sizeof(WCHAR) * 
1110: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
1120: 5f 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e  _PATH_CHARS).#en
1130: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
1140: 75 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  um error message
1150: 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72   length (in char
1160: 73 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f  s) for WinRT..*/
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
1190: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
11a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
11b0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28  X_ERRMSG_CHARS (
11c0: 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  1024).#endif../*
11d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
11e0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72  zero if the char
11f0: 61 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20  acter should be 
1200: 74 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72  treated as a dir
1210: 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61  ectory.** separa
1220: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
1230: 77 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64  winIsDirSep.#  d
1240: 65 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65  efine winIsDirSe
1250: 70 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  p(a)            
1260: 20 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27      (((a) == '/'
1270: 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c  ) || ((a) == '\\
1280: 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ')).#endif../*.*
1290: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  * This macro is 
12a0: 75 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61  used when a loca
12b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  l variable is se
12c0: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61  t to a value tha
12d0: 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d  t is.** [sometim
12e0: 65 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  es] not used by 
12f0: 74 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76  the code (e.g. v
1300: 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  ia conditional c
1310: 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a  ompilation)..*/.
1320: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56  #ifndef UNUSED_V
1330: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20  ARIABLE_VALUE.# 
1340: 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56   define UNUSED_V
1350: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29  ARIABLE_VALUE(x)
1360: 20 20 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a        (void)(x).
1370: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1380: 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61 63  turns the charac
1390: 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ter that should 
13a0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 64  be used as the d
13b0: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
13c0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77  or..*/.#ifndef w
13d0: 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20 64  inGetDirSep.#  d
13e0: 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53  efine winGetDirS
13f0: 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ep()            
1400: 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a      '\\'.#endif.
1410: 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65  ./*.** Do we nee
1420: 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65  d to manually de
1430: 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66  fine the Win32 f
1440: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73  ile mapping APIs
1450: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41   for use with WA
1460: 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d  L.** mode or mem
1470: 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
1480: 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49   (e.g. these API
1490: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
14a0: 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a  in the Windows.*
14b0: 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  * CE SDK; howeve
14c0: 72 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  r, they are not 
14d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68  present in the h
14e0: 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a  eader file)?.*/.
14f0: 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  #if SQLITE_WIN32
1500: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
1510: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
1520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1530: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
1540: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1550: 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66  >0)./*.** Two of
1560: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e   the file mappin
1570: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65  g APIs are diffe
1580: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54  rent under WinRT
1590: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
15a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65  ich.** set we ne
15b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
15c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41  E_OS_WINRT.WINBA
15d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
15e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
15f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e  ppingFromApp(HAN
1600: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
1610: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
1620: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  UTES, ULONG, ULO
1630: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a  NG64, LPCWSTR);.
1640: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
1650: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
1660: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48  wOfFileFromApp(H
1670: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c  ANDLE, ULONG, UL
1680: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a  ONG64, SIZE_T);.
1690: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
16a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
16b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45  AS_ANSI).WINBASE
16c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
16d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
16e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingA(HANDLE, LPS
16f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1700: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1710: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1720: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64  D, LPCSTR);.#end
1730: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1750: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  NSI) */..#if def
1760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1770: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42  2_HAS_WIDE).WINB
1780: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1790: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
17a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20  appingW(HANDLE, 
17b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
17c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
17d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
17e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a  WORD, LPCWSTR);.
17f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1800: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1810: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e  AS_WIDE) */..WIN
1820: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
1830: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
1840: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52  ile(HANDLE, DWOR
1850: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1860: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66   SIZE_T);.#endif
1870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1880: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NRT */../*.** Th
1890: 65 73 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ese file mapping
18a0: 20 41 50 49 73 20 61 72 65 20 63 6f 6d 6d 6f 6e   APIs are common
18b0: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
18c0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 0a 57 49  nd WinRT..*/..WI
18d0: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
18e0: 4e 41 50 49 20 46 6c 75 73 68 56 69 65 77 4f 66  NAPI FlushViewOf
18f0: 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c 20 53 49  File(LPCVOID, SI
1900: 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53 45 41 50  ZE_T);.WINBASEAP
1910: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
1920: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
1930: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1940: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1950: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 2a  ILEMAPPING_API *
1960: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
1970: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
1980: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
1990: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
19a0: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ef INVALID_FILE_
19b0: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66  ATTRIBUTES.# def
19c0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  ine INVALID_FILE
19d0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57  _ATTRIBUTES ((DW
19e0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
19f0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
1a00: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
1a10: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
1a20: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
1a30: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
1a40: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
1a50: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
1a60: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
1a70: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
1a80: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
1a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
1ab0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1ac0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
1ad0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64  for WAL */.typed
1ae0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
1af0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20   winShm;        
1b00: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69     /* A connecti
1b10: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1b20: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1b40: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f   winShmNode;   /
1b50: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68  * A region of sh
1b60: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23  ared-memory */.#
1b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
1b80: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
1b90: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
1ba0: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
1bb0: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
1bc0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
1bd0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
1be0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1bf0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75  NCE.typedef stru
1c00: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20  ct winceLock {. 
1c10: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20   int nReaders;  
1c20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c30: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f  f reader locks o
1c40: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1c50: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  L bPending;     
1c60: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1c70: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
1c80: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1c90: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76  /.  BOOL bReserv
1ca0: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  ed;     /* Indic
1cb0: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20  ates a reserved 
1cc0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1cd0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
1ce0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20   bExclusive;    
1cf0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20  /* Indicates an 
1d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68  exclusive lock h
1d10: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1d20: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b   */.} winceLock;
1d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d40: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63  he winFile struc
1d50: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61  ture is a subcla
1d60: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1d70: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20  le* specific to 
1d80: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72  the win32.** por
1d90: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a  tability layer..
1da0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1db0: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c  t winFile winFil
1dc0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c  e;.struct winFil
1dd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  e {.  const sqli
1de0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1df0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75  pMethod; /*** Mu
1e00: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f  st be first ***/
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e20: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68  pVfs;      /* Th
1e30: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70  e VFS used to op
1e40: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  en this file */.
1e50: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20    HANDLE h;     
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1e70: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1e80: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
1e90: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  u8 locktype;    
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
1eb0: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
1ec0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
1ed0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73  ile */.  short s
1ee0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20  haredLockByte;  
1ef0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f   /* Randomly cho
1f00: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73  sen byte used as
1f10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a   a shared lock *
1f20: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73  /.  u8 ctrlFlags
1f30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
1f40: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49  lags.  See WINFI
1f50: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  LE_* below */.  
1f60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1f80: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1f90: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1fa0: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rror */.#ifndef 
1fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1fc0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20    winShm *pShm; 
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1fe0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20  tance of shared 
1ff0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66  memory on this f
2000: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
2010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2020: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
2030: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
2040: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
2050: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
2060: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
2070: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
2080: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
2090: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
20a0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
20b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
20c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
20d0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
20e0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
20f0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
2100: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
2110: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
2120: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
2130: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ock */.  HANDLE 
2140: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
2150: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
2160: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
2170: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
2180: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
2190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
21a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
21b0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
21c0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
21d0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
21e0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
21f0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
2200: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
2210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2220: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2230: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
2240: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
2270: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
2280: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
22b0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
22c0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
22d0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22f0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
2300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2310: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
2320: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
2330: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
2340: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2350: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
2360: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
2370: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
2380: 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
2390: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 56  ../*.** The winV
23a0: 66 73 41 70 70 44 61 74 61 20 73 74 72 75 63 74  fsAppData struct
23b0: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
23c0: 74 68 65 20 70 41 70 70 44 61 74 61 20 6d 65 6d  the pAppData mem
23d0: 62 65 72 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  ber for all of t
23e0: 68 65 0a 2a 2a 20 57 69 6e 33 32 20 56 46 53 20  he.** Win32 VFS 
23f0: 76 61 72 69 61 6e 74 73 2e 0a 2a 2f 0a 74 79 70  variants..*/.typ
2400: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 56  edef struct winV
2410: 66 73 41 70 70 44 61 74 61 20 77 69 6e 56 66 73  fsAppData winVfs
2420: 41 70 70 44 61 74 61 3b 0a 73 74 72 75 63 74 20  AppData;.struct 
2430: 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 7b 0a  winVfsAppData {.
2440: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2450: 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
2460: 68 6f 64 3b 20 2f 2a 20 54 68 65 20 66 69 6c 65  hod; /* The file
2470: 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 74 6f 20   I/O methods to 
2480: 75 73 65 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  use. */.  void *
2490: 70 41 70 70 44 61 74 61 3b 20 20 20 20 20 20 20  pAppData;       
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b0: 54 68 65 20 65 78 74 72 61 20 70 41 70 70 44 61  The extra pAppDa
24c0: 74 61 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ta, if any. */. 
24d0: 20 42 4f 4f 4c 20 62 4e 6f 4c 6f 63 6b 3b 20 20   BOOL bNoLock;  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20      /* Non-zero 
2500: 69 66 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 69  if locking is di
2510: 73 61 62 6c 65 64 2e 20 2a 2f 0a 7d 3b 0a 0a 2f  sabled. */.};../
2520: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2530: 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e  ues for winFile.
2540: 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  ctrlFlags.*/.#de
2550: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f  fine WINFILE_RDO
2560: 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30  NLY          0x0
2570: 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f  2   /* Connectio
2580: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
2590: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
25a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20  E_PERSIST_WAL   
25b0: 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73    0x04   /* Pers
25c0: 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20  istent WAL mode 
25d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
25e0: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20  LE_PSOW         
25f0: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c     0x10   /* SQL
2600: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
2610: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
2620: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65  ../*. * The size
2630: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75   of the buffer u
2640: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  sed by sqlite3_w
2650: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
2660: 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ().. */.#ifndef 
2670: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
2680: 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66  _BUF_SIZE.#  def
2690: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
26a0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20  _DBG_BUF_SIZE   
26b0: 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65  ((int)(4096-size
26c0: 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64  of(DWORD))).#end
26d0: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
26e0: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
26f0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
2700: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
2710: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
2720: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
2730: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
2740: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
2750: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
2760: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
2770: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
2780: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
2790: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
27a0: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
27b0: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
27c0: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
27d0: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
27e0: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
27f0: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
2800: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
2810: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
2820: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
2830: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
2840: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
2850: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
2860: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
2870: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2880: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
2890: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
28a0: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
2900: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
2910: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
2920: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
2930: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
2940: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
2950: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
2960: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
2970: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
2980: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
2990: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
29a0: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
29b0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
29c0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
29d0: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
29e0: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
29f0: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
2a00: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
2a10: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
2a20: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
2a30: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
2a40: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
2a50: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
2a60: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
2a70: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
2a80: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
2a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad0: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
2ae0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2af0: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
2b00: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2b10: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 20 20  EAP_CREATE      
2b20: 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a    (TRUE).#endif.
2b30: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74  ./*. * This is t
2b40: 68 65 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  he maximum possi
2b50: 62 6c 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65  ble initial size
2b60: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70   of the Win32-sp
2b70: 65 63 69 66 69 63 20 68 65 61 70 2c 20 69 6e 0a  ecific heap, in.
2b80: 20 2a 20 62 79 74 65 73 2e 0a 20 2a 2f 0a 23 69   * bytes.. */.#i
2b90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2ba0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49 4e 49 54  32_HEAP_MAX_INIT
2bb0: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
2bc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2bd0: 50 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 20  P_MAX_INIT_SIZE 
2be0: 28 34 32 39 34 39 36 37 32 39 35 55 29 0a 23 65  (4294967295U).#e
2bf0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73  ndif../*. * This
2c00: 20 69 73 20 74 68 65 20 65 78 74 72 61 20 73 70   is the extra sp
2c10: 61 63 65 20 66 6f 72 20 74 68 65 20 69 6e 69 74  ace for the init
2c20: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
2c30: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2c40: 65 61 70 2c 0a 20 2a 20 69 6e 20 62 79 74 65 73  eap,. * in bytes
2c50: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2c60: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2c70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
2c80: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45 58  N32_HEAP_INIT_EX
2c90: 54 52 41 0a 23 20 20 64 65 66 69 6e 65 20 53 51  TRA.#  define SQ
2ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2cb0: 49 4e 49 54 5f 45 58 54 52 41 20 20 28 34 31 39  INIT_EXTRA  (419
2cc0: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
2cd0: 0a 20 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68  . * Calculate th
2ce0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
2cf0: 63 61 63 68 65 20 73 69 7a 65 2c 20 69 6e 20 70  cache size, in p
2d00: 61 67 65 73 2c 20 62 61 73 65 64 20 6f 6e 20 74  ages, based on t
2d10: 68 65 20 6d 61 78 69 6d 75 6d 0a 20 2a 20 70 6f  he maximum. * po
2d20: 73 73 69 62 6c 65 20 69 6e 69 74 69 61 6c 20 68  ssible initial h
2d30: 65 61 70 20 73 69 7a 65 20 61 6e 64 20 74 68 65  eap size and the
2d40: 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2d50: 7a 65 2c 20 73 65 74 74 69 6e 67 20 61 73 69 64  ze, setting asid
2d60: 65 20 74 68 65 0a 20 2a 20 6e 65 65 64 65 64 20  e the. * needed 
2d70: 65 78 74 72 61 20 73 70 61 63 65 2e 0a 20 2a 2f  extra space.. */
2d80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d90: 57 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f  WIN32_MAX_CACHE_
2da0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
2db0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
2dc0: 43 41 43 48 45 5f 53 49 5a 45 20 20 20 28 28 28  CACHE_SIZE   (((
2dd0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2de0: 50 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 29  P_MAX_INIT_SIZE)
2df0: 20 2d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   - \.           
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2e30: 50 5f 49 4e 49 54 5f 45 58 54 52 41 29 29 20 2f  P_INIT_EXTRA)) /
2e40: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
2e70: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2e80: 5f 53 49 5a 45 29 29 0a 23 65 6e 64 69 66 0a 0a  _SIZE)).#endif..
2e90: 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 63 61  /*. * This is ca
2ea0: 63 68 65 20 73 69 7a 65 20 75 73 65 64 20 69 6e  che size used in
2eb0: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 69 6f 6e   the calculation
2ec0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20   of the initial 
2ed0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 2a 20 57  size of the. * W
2ee0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65  in32-specific he
2ef0: 61 70 2e 20 20 49 74 20 63 61 6e 6e 6f 74 20 62  ap.  It cannot b
2f00: 65 20 6e 65 67 61 74 69 76 65 2e 0a 20 2a 2f 0a  e negative.. */.
2f10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2f20: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a  IN32_CACHE_SIZE.
2f30: 23 20 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46  #  if SQLITE_DEF
2f40: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3e  AULT_CACHE_SIZE>
2f50: 3d 30 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  =0.#    define S
2f60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48  QLITE_WIN32_CACH
2f70: 45 5f 53 49 5a 45 20 20 20 20 20 28 53 51 4c 49  E_SIZE     (SQLI
2f80: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
2f90: 5f 53 49 5a 45 29 0a 23 20 20 65 6c 73 65 0a 23  _SIZE).#  else.#
2fa0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
2fb0: 45 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49  E_WIN32_CACHE_SI
2fc0: 5a 45 20 20 20 20 20 28 2d 28 53 51 4c 49 54 45  ZE     (-(SQLITE
2fd0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
2fe0: 49 5a 45 29 29 0a 23 20 20 65 6e 64 69 66 0a 23  IZE)).#  endif.#
2ff0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 4d 61 6b  endif../*. * Mak
3000: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
3010: 63 61 6c 63 75 6c 61 74 65 64 20 63 61 63 68 65  calculated cache
3020: 20 73 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c   size, in pages,
3030: 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 74 68   cannot cause th
3040: 65 0a 20 2a 20 69 6e 69 74 69 61 6c 20 73 69 7a  e. * initial siz
3050: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
3060: 70 65 63 69 66 69 63 20 68 65 61 70 20 74 6f 20  pecific heap to 
3070: 65 78 63 65 65 64 20 74 68 65 20 6d 61 78 69 6d  exceed the maxim
3080: 75 6d 20 61 6d 6f 75 6e 74 0a 20 2a 20 6f 66 20  um amount. * of 
3090: 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20  memory that can 
30a0: 62 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  be specified in 
30b0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 48 65 61 70  the call to Heap
30c0: 43 72 65 61 74 65 2e 0a 20 2a 2f 0a 23 69 66 20  Create.. */.#if 
30d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43  SQLITE_WIN32_CAC
30e0: 48 45 5f 53 49 5a 45 3e 53 51 4c 49 54 45 5f 57  HE_SIZE>SQLITE_W
30f0: 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f 53  IN32_MAX_CACHE_S
3100: 49 5a 45 0a 23 20 20 75 6e 64 65 66 20 53 51 4c  IZE.#  undef SQL
3110: 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f  ITE_WIN32_CACHE_
3120: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
3130: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48  QLITE_WIN32_CACH
3140: 45 5f 53 49 5a 45 20 20 20 20 20 20 20 28 32 30  E_SIZE       (20
3150: 30 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  00).#endif../*. 
3160: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69  * The initial si
3170: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
3180: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
3190: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
31a0: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
31b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
31c0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a  _HEAP_INIT_SIZE.
31d0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
31e0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
31f0: 5f 53 49 5a 45 20 20 20 28 28 53 51 4c 49 54 45  _SIZE   ((SQLITE
3200: 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a  _WIN32_CACHE_SIZ
3210: 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20  E) * \.         
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
3250: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 5c 0a 20  PAGE_SIZE) + \. 
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
3290: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
32a0: 45 58 54 52 41 29 29 0a 23 65 6e 64 69 66 0a 0a  EXTRA)).#endif..
32b0: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
32c0: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  m size of the Wi
32d0: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
32e0: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
32f0: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
3300: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
3310: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
3320: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
3330: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
3340: 41 58 5f 53 49 5a 45 20 20 20 20 28 30 29 0a 23  AX_SIZE    (0).#
3350: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
3360: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
3370: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
3380: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
3390: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
33a0: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
33b0: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
33c0: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
33d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
33e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
33f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3400: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
3410: 20 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66        (0).#endif
3420: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  .../*.** The win
3430: 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72  MemData structur
3440: 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61  e stores informa
3450: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
3460: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
3470: 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  fic.** sqlite3_m
3480: 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65  em_methods imple
3490: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mentation..*/.ty
34a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
34b0: 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61  MemData winMemDa
34c0: 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65  ta;.struct winMe
34d0: 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20  mData {.#ifndef 
34e0: 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67  NDEBUG.  u32 mag
34f0: 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20  ic1;   /* Magic 
3500: 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74  number to detect
3510: 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
3520: 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66  ption. */.#endif
3530: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
3540: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
3550: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
3560: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
3570: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
3580: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
3590: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
35a0: 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  n)? */.#ifndef N
35b0: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
35c0: 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c2;   /* Magic n
35d0: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
35e0: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
35f0: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
3600: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
3610: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
3620: 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30 78 34  M_MAGIC1     0x4
3630: 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e 65 20  2b2830b.#define 
3640: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20  WINMEM_MAGIC2   
3650: 20 20 30 78 62 64 34 64 37 63 66 34 0a 23 65 6e    0xbd4d7cf4.#en
3660: 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75  dif..static stru
3670: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
3680: 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23  n_mem_data = {.#
3690: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
36a0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23  WINMEM_MAGIC1,.#
36b0: 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41  endif.  NULL, FA
36c0: 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  LSE.#ifndef NDEB
36d0: 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47  UG.  ,WINMEM_MAG
36e0: 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23  IC2.#endif.};..#
36f0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
3700: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
3710: 72 74 4d 61 67 69 63 31 28 29 20 61 73 73 65 72  rtMagic1() asser
3720: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
3730: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
3740: 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e 65 20  AGIC1 ).#define 
3750: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
3760: 63 32 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c2() assert( win
3770: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32  _mem_data.magic2
3780: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
3790: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ).#define winMem
37a0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 20 20 77  AssertMagic()  w
37b0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
37c0: 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72  1(); winMemAsser
37d0: 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c 73 65  tMagic2();.#else
37e0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
37f0: 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e  ssertMagic().#en
3800: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e  dif..#define win
3810: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 20  MemGetDataPtr() 
3820: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23   &win_mem_data.#
3830: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
3840: 48 65 61 70 28 29 20 20 20 20 20 77 69 6e 5f 6d  Heap()     win_m
3850: 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 23 64  em_data.hHeap.#d
3860: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f  efine winMemGetO
3870: 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f 6d 65  wned()    win_me
3880: 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73  m_data.bOwned..s
3890: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
38a0: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
38b0: 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  tes);.static voi
38c0: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
38d0: 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74  d *pPrior);.stat
38e0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
38f0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
3900: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
3910: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
3920: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
3930: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
3940: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
3950: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
3960: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
3970: 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63  AppData);.static
3980: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
3990: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
39a0: 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c  ata);..const sql
39b0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
39c0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
39d0: 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64  in32(void);.#end
39e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
39f0: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
3a00: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3a10: 67 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e  g variable is (n
3a20: 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63  ormally) set onc
3a30: 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e  e and never chan
3a40: 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65  ges.** thereafte
3a50: 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77  r.  It records w
3a60: 68 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61  hether the opera
3a70: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3a80: 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54  in9x.** or WinNT
3a90: 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65  ..**.** 0:   Ope
3aa0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e  rating system un
3ab0: 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f  known..** 1:   O
3ac0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3ad0: 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20  is Win9x..** 2: 
3ae0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
3af0: 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  em is WinNT..**.
3b00: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66  ** In order to f
3b10: 61 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e  acilitate testin
3b20: 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73  g on a WinNT sys
3b30: 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69  tem, the test fi
3b40: 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e  xture.** can man
3b50: 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76  ually set this v
3b60: 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75  alue to 1 to emu
3b70: 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76  late Win98 behav
3b80: 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ior..*/.#ifdef S
3b90: 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e 47 20  QLITE_TEST.LONG 
3ba0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c  SQLITE_WIN32_VOL
3bb0: 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73  ATILE sqlite3_os
3bc0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65  _type = 0;.#else
3bd0: 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53 51 4c  .static LONG SQL
3be0: 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49  ITE_WIN32_VOLATI
3bf0: 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  LE sqlite3_os_ty
3c00: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
3c10: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
3c20: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
3c30: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
3c40: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a  l_ptr.#endif../*
3c50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c60: 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  n is not availab
3c70: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
3c80: 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a   or WinRT.. */..
3c90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3ca0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
3cb0: 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65  _WINRT.#  define
3cc0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3cd0: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e  SI()       1.#en
3ce0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20  dif../*.** Many 
3cf0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65  system calls are
3d00: 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67   accessed throug
3d10: 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e  h pointer-to-fun
3d20: 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a  ctions so that.*
3d30: 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76  * they may be ov
3d40: 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74  erridden at runt
3d50: 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74  ime to facilitat
3d60: 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f  e fault injectio
3d70: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  n during.** test
3d80: 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69  ing and sandboxi
3d90: 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ng.  The followi
3da0: 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74  ng array holds t
3db0: 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69  he names and poi
3dc0: 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20  nters.** to all 
3dd0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
3de0: 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74  tem calls..*/.st
3df0: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f  atic struct win_
3e00: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
3e10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
3e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3e30: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
3e40: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
3e50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
3e60: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
3e70: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
3e80: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
3e90: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3ea0: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
3eb0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
3ec0: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
3ed0: 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  = {.#if !SQLITE_
3ee0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
3ef0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
3f00: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
3f10: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
3f20: 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73  CALL)AreFileApis
3f30: 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20  ANSI,         0 
3f40: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72  },.#else.  { "Ar
3f50: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
3f60: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3f70: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3f80: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3f90: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
3fa0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
3fb0: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
3fc0: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
3fd0: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
3fe0: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
3ff0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
4000: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4010: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
4020: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4030: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f  IDE).  { "CharLo
4040: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
4050: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
4060: 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20  rLowerW,        
4070: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4080: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
4090: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
40a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
40d0: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77  define osCharLow
40e0: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
40f0: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
4100: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
4110: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4120: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4130: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4140: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4150: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
4160: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4170: 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20  LL)CharUpperW,  
4180: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4190: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72  .#else.  { "Char
41a0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
41b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
41c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
41d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
41e0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
41f0: 68 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53  harUpperW ((LPWS
4200: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53  TR(WINAPI*)(LPWS
4210: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  TR))aSyscall[2].
4220: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4230: 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20  CloseHandle",   
4240: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4250: 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20  LL)CloseHandle, 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4270: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ..#define osClos
4280: 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57  eHandle ((BOOL(W
4290: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
42a0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
42b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
42c0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
42d0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43  HAS_ANSI).  { "C
42e0: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
42f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4300: 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20  L)CreateFileA,  
4310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4320: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
4330: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
4340: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4370: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
4380: 65 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44  eateFileA ((HAND
4390: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
43a0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  TR,DWORD,DWORD, 
43b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
43c0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
43d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44  DWORD,DWORD,HAND
43e0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  LE))aSyscall[4].
43f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4400: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4410: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4420: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4430: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
4440: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
4450: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
4460: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
4470: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4480: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
44a0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
44c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
44d0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
44e0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
44f0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
4500: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
4510: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
4520: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
4530: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
4540: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
4550: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4560: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4580: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
4590: 20 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65          (!define
45a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
45b0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
45c0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20 26 26  _MMAP_SIZE>0) &&
45d0: 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   \.        SQLIT
45e0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
45f0: 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b 20 22  LEMAPPINGA.  { "
4600: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
4610: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
4620: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
4630: 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  pingA,      0 },
4640: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
4650: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
4660: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4680: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4690: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
46a0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
46b0: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
46c0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
46d0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
46e0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
46f0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4700: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36  CSTR))aSyscall[6
4710: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4720: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4730: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
4740: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
4750: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4760: 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20  S_WIDE) && \.   
4770: 20 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53       (!defined(S
4780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
4790: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
47a0: 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20  AP_SIZE>0)).  { 
47b0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
47c0: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
47d0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
47e0: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
47f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
4800: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
4810: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4820: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4830: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4840: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4850: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
4860: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
4870: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
4880: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4890: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
48a0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
48b0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
48c0: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
48d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
48e0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
48f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4900: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
4910: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
4920: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
4930: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
4940: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4950: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
4960: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
4970: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
49a0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
49b0: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
49c0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
49d0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
49e0: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
49f0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4a00: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
4a10: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4a20: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4a30: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
4a40: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
4a50: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
4a60: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
4a70: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4a80: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4aa0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4ac0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4ad0: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
4ae0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4af0: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4b00: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
4b10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4b20: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4b30: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
4b40: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
4b50: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
4b60: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
4b70: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4b80: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4ba0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4bd0: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4be0: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
4bf0: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
4c00: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
4c10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4c20: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
4c30: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
4c40: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
4c50: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
4c60: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
4c70: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
4c80: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4c90: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4cc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
4cd0: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4ce0: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
4cf0: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
4d00: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4d10: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4d20: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
4d30: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
4d40: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
4d50: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
4d60: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
4d70: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
4d80: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
4d90: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4da0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4de0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4df0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4e00: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4e10: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4e20: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
4e30: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
4e40: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
4e50: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
4e60: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
4e70: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
4e80: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
4e90: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4ea0: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
4eb0: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
4ec0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4ed0: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
4ee0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4ef0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4f00: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
4f10: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
4f20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
4f30: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
4f40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4f50: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
4f60: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
4f70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4fa0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4fb0: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
4fc0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4fd0: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4fe0: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
4ff0: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
5000: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
5010: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
5020: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5030: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5040: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
5050: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
5060: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
5070: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
5080: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5090: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
50a0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
50b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
50d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
50e0: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
50f0: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
5100: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
5110: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
5120: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
5130: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
5140: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
5150: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
5160: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5170: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
5180: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
5190: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
51a0: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
51b0: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
51c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
51d0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
51f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5210: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5220: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
5230: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
5240: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
5250: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
5260: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
5270: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
5280: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
5290: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
52a0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
52b0: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
52c0: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
52d0: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
52e0: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
52f0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5300: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
5310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5320: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5330: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
5340: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
5350: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
5360: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
5370: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5380: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
5390: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
53a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
53b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
53c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
53d0: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
53e0: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
53f0: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
5400: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
5410: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5420: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
5430: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
5440: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5450: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
5460: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5470: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5480: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5490: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
54a0: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
54b0: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
54c0: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
54d0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
54e0: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
54f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5520: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5530: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
5540: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5550: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
5560: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
5570: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
5580: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
5590: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
55a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
55b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
55c0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
55d0: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
55e0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
55f0: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
5600: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5610: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
5620: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
5630: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5640: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5650: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5660: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
5670: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
5680: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
5690: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
56a0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
56b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
56c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
56d0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
56e0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
56f0: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
5700: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
5710: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
5720: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5730: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5740: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
5750: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5760: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5770: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5780: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
5790: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
57a0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
57b0: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
57c0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
57d0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
57e0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
57f0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5800: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
5810: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
5820: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
5830: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
5840: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
5850: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5880: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5890: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
58a0: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
58b0: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
58c0: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
58d0: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
58e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
58f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5900: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5910: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
5920: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
5930: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
5940: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
5950: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5960: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5980: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
59a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
59b0: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
59c0: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
59d0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
59e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
59f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5a00: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5a10: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5a20: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5a30: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
5a40: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
5a50: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
5a60: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
5a70: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5a80: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5a90: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5aa0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5ac0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5ad0: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5ae0: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
5af0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
5b00: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
5b10: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
5b20: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
5b30: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5b40: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
5b50: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5b60: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5b70: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5b80: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5b90: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
5ba0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5bb0: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
5bc0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5bd0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5be0: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5bf0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5c20: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
5c30: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
5c40: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
5c50: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
5c60: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
5c70: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
5c80: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5c90: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
5ca0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5cb0: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
5cc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5cd0: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
5ce0: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
5cf0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
5d00: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
5d10: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
5d20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
5d30: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
5d40: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
5d50: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
5d60: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
5d70: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
5d80: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
5d90: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
5da0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5db0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5dc0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
5dd0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
5de0: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
5df0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
5e00: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
5e10: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
5e20: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
5e30: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
5e40: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
5e50: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
5e60: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
5e70: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
5e80: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5e90: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
5ea0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
5eb0: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
5ec0: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5ed0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f00: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
5f10: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
5f20: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
5f30: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
5f40: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
5f50: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
5f60: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5f70: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
5f80: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
5f90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5fa0: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
5fb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5fc0: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5fd0: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5fe0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6010: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
6020: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
6030: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
6040: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
6050: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
6060: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
6070: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6080: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
6090: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
60a0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
60b0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
60c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
60d0: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
60e0: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
60f0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6100: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
6110: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
6120: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
6130: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
6140: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
6150: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
6160: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
6170: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
61a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
61b0: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
61c0: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
61d0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
61e0: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
61f0: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
6200: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6210: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6220: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
6230: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
6240: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
6250: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
6260: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6270: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
6280: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
6290: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
62c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
62d0: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
62e0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
62f0: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
6300: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
6310: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6320: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
6330: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
6340: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
6350: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
6360: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
6370: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
6380: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6390: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
63a0: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
63b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
63e0: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
63f0: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
6400: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
6410: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
6420: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6430: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6440: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
6450: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
6460: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
6470: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
6480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6490: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
64a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
64b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
64d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
64e0: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
64f0: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
6500: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
6510: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
6520: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6530: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
6540: 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57  NSI) && SQLITE_W
6550: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
6560: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
6570: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
6580: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
6590: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
65a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
65b0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
65c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
65d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
65f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6600: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
6610: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
6620: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
6630: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
6640: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
6650: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6660: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6680: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
6690: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
66a0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
66b0: 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56  SIONEX.  { "GetV
66c0: 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20  ersionExW",     
66d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
66e0: 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20  etVersionExW,   
66f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6700: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
6710: 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  onExW",         
6720: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6750: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
6760: 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28  rsionExW ((BOOL(
6770: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
6780: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
6790: 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOW))aSyscall[3
67a0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
67b0: 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20  { "HeapAlloc",  
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
67d0: 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c  SCALL)HeapAlloc,
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
67f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
6800: 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  eapAlloc ((LPVOI
6810: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
6820: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
6830: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
6840: 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74  all[36].pCurrent
6850: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6860: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6870: 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  pCreate",       
6880: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6890: 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20  HeapCreate,     
68a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
68b0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65  lse.  { "HeapCre
68c0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
68d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6900: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6910: 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28  Create ((HANDLE(
6920: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53  WINAPI*)(DWORD,S
6930: 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20  IZE_T, \.       
6940: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6950: 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[37].pCurrent).
6960: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6970: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44  WINRT.  { "HeapD
6980: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
6990: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
69a0: 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  apDestroy,      
69b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
69c0: 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72  e.  { "HeapDestr
69d0: 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oy",            
69e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6a10: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65  #define osHeapDe
6a20: 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e  stroy ((BOOL(WIN
6a30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
6a40: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
6a50: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46  ent)..  { "HeapF
6a60: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
6a70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6a80: 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  apFree,         
6a90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6aa0: 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20  fine osHeapFree 
6ab0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6ac0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56  HANDLE,DWORD,LPV
6ad0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39  OID))aSyscall[39
6ae0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6af0: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20   "HeapReAlloc", 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6b10: 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63  CALL)HeapReAlloc
6b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
6b30: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6b40: 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  apReAlloc ((LPVO
6b50: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
6b60: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c  LE,DWORD,LPVOID,
6b70: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6b80: 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e  T))aSyscall[40].
6b90: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6ba0: 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20  HeapSize",      
6bb0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6bc0: 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20  LL)HeapSize,    
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6be0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6bf0: 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49  Size ((SIZE_T(WI
6c00: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6c10: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
6c20: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
6c30: 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [41].pCurrent)..
6c40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6c50: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61  INRT.  { "HeapVa
6c60: 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  lidate",        
6c70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6c80: 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20  pValidate,      
6c90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6ca0: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
6cb0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
6cc0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6cf0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c  define osHeapVal
6d00: 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e  idate ((BOOL(WIN
6d10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6d20: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6d30: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
6d40: 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  42].pCurrent)..#
6d50: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6d60: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
6d70: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6d80: 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20  pCompact",      
6d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6da0: 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20 20 20  HeapCompact,    
6db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6dc0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d  lse.  { "HeapCom
6dd0: 70 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20  pact",          
6de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6e10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6e20: 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54 28 57  Compact ((UINT(W
6e30: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6e40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6e50: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
6e60: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6e70: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
6e80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6e90: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
6ea0: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
6eb0: 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20  adLibraryA",    
6ec0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6ed0: 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20  )LoadLibraryA,  
6ee0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6ef0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
6f00: 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20  braryA",        
6f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6f40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
6f50: 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44  dLibraryA ((HMOD
6f60: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
6f70: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 34  STR))aSyscall[44
6f80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6f90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6fa0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
6fb0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
6fc0: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
6fd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6fe0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
6ff0: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  SION).  { "LoadL
7000: 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20  ibraryW",       
7010: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
7020: 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20  adLibraryW,     
7030: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7040: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
7050: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
7060: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7090: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
70a0: 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45  braryW ((HMODULE
70b0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
70c0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e  R))aSyscall[45].
70d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
70e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
70f0: 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c    { "LocalFree",
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7110: 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65  SYSCALL)LocalFre
7120: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7130: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7140: 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20  "LocalFree",    
7150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7160: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7180: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7190: 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28  e osLocalFree ((
71a0: 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28  HLOCAL(WINAPI*)(
71b0: 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c  HLOCAL))aSyscall
71c0: 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [46].pCurrent)..
71d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
71e0: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
71f0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
7200: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
7210: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7220: 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  )LockFile,      
7230: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7240: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
7250: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7260: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7290: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
72a0: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
72b0: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
72c0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
72d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
72e0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
72f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d  RD))aSyscall[47]
7300: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7310: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
7320: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63  S_WINCE.  { "Loc
7330: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
7340: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7350: 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20  LockFileEx,     
7360: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7370: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
7380: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
7390: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
73c0: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
73d0: 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f  FileEx.#define o
73e0: 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  sLockFileEx ((BO
73f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7400: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
7410: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7420: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
7430: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d  ED))aSyscall[48]
7440: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7450: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
7460: 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49  _WINCE || (!SQLI
7470: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c  TE_OS_WINRT && \
7480: 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69 6e  .        (!defin
7490: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
74a0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
74b0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a  X_MMAP_SIZE>0)).
74c0: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
74d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
74e0: 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f  SYSCALL)MapViewO
74f0: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
7500: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7510: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
7520: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7530: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7550: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7560: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
7570: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  e ((LPVOID(WINAP
7580: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
7590: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
75a0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
75b0: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
75c0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c  rrent)..  { "Mul
75d0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
75e0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
75f0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
7600: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  har,     0 },..#
7610: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79  define osMultiBy
7620: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69  teToWideChar ((i
7630: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
7640: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e  ,DWORD,LPCSTR,in
7650: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  t,LPWSTR, \.    
7660: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c      int))aSyscal
7670: 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[50].pCurrent).
7680: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f  .  { "QueryPerfo
7690: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20  rmanceCounter", 
76a0: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65  (SYSCALL)QueryPe
76b0: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
76c0: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
76d0: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
76e0: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c  ceCounter ((BOOL
76f0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
7700: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47       LARGE_INTEG
7710: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  ER*))aSyscall[51
7720: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7730: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20   "ReadFile",    
7740: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7750: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20  CALL)ReadFile,  
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7770: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  },..#define osRe
7780: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  adFile ((BOOL(WI
7790: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
77a0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
77b0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
77c0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
77d0: 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e  call[52].pCurren
77e0: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f  t)..  { "SetEndO
77f0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
7800: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45     (SYSCALL)SetE
7810: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ndOfFile,       
7820: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
7830: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  ne osSetEndOfFil
7840: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
7850: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
7860: 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[53].pCurrent)
7870: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7880: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46  _WINRT.  { "SetF
7890: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
78a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
78b0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20  etFilePointer,  
78c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
78d0: 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  se.  { "SetFileP
78e0: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
78f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7920: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69  .#define osSetFi
7930: 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52  lePointer ((DWOR
7940: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7950: 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a  E,LONG,PLONG, \.
7960: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
7970: 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72  Syscall[54].pCur
7980: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
7990: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
79a0: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
79b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
79c0: 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20  ALL)Sleep,      
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
79e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65  ,.#else.  { "Sle
79f0: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
7a00: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7a10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7a20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7a30: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7a40: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e  Sleep ((VOID(WIN
7a50: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79  API*)(DWORD))aSy
7a60: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
7a70: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d  nt)..  { "System
7a80: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c  TimeToFileTime",
7a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73      (SYSCALL)Sys
7aa0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
7ab0: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  e,    0 },..#def
7ac0: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65  ine osSystemTime
7ad0: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  ToFileTime ((BOO
7ae0: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
7af0: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a   SYSTEMTIME*, \.
7b00: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
7b10: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d  ME))aSyscall[56]
7b20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7b30: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7b40: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
7b50: 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  INRT.  { "Unlock
7b60: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7b70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c      (SYSCALL)Unl
7b80: 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20  ockFile,        
7b90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7ba0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7bb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7bc0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7bf0: 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46  ifndef osUnlockF
7c00: 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  ile.#define osUn
7c10: 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  lockFile ((BOOL(
7c20: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7c30: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
7c40: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
7c50: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  RD))aSyscall[57]
7c60: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7c70: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
7c80: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c  S_WINCE.  { "Unl
7c90: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
7ca0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7cb0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  UnlockFileEx,   
7cc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7cd0: 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  lse.  { "UnlockF
7ce0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
7cf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7d20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f  ..#define osUnlo
7d30: 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28  ckFileEx ((BOOL(
7d40: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7d50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
7d60: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
7d70: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
7d80: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
7d90: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7da0: 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e  _WINCE || !defin
7db0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
7dc0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
7dd0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
7de0: 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  { "UnmapViewOfFi
7df0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  le",         (SY
7e00: 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f  SCALL)UnmapViewO
7e10: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30  fFile,         0
7e20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
7e30: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  nmapViewOfFile",
7e40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7e50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7e60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7e70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7e80: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
7e90: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
7ea0: 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63  )(LPCVOID))aSysc
7eb0: 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74  all[59].pCurrent
7ec0: 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72  )..  { "WideChar
7ed0: 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20  ToMultiByte",   
7ee0: 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43    (SYSCALL)WideC
7ef0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20  harToMultiByte, 
7f00: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
7f10: 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  e osWideCharToMu
7f20: 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49  ltiByte ((int(WI
7f30: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
7f40: 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50  D,LPCWSTR,int,LP
7f50: 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20  STR,int, \.     
7f60: 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c     LPCSTR,LPBOOL
7f70: 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70  ))aSyscall[60].p
7f80: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
7f90: 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20  riteFile",      
7fa0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7fb0: 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20  L)WriteFile,    
7fc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7fd0: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
7fe0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7ff0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56  PI*)(HANDLE,LPCV
8000: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
8010: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
8020: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
8030: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
8040: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
8050: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
8060: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
8070: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
8080: 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20  reateEventExW,  
8090: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
80a0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  se.  { "CreateEv
80b0: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
80c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
80f0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
8100: 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44  eEventExW ((HAND
8110: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
8120: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
8130: 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  S,LPCWSTR, \.   
8140: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
8150: 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70  ))aSyscall[62].p
8160: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
8170: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
8180: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
8190: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
81a0: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
81b0: 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20  ngleObject,     
81c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
81d0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
81e0: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
81f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8200: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8210: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8220: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
8230: 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57  Object ((DWORD(W
8240: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
8250: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
8260: 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43  )aSyscall[63].pC
8270: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
8280: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
8290: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
82a0: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
82b0: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
82c0: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
82d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
82e0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
82f0: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
8300: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8320: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8330: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
8340: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
8350: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8360: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
8370: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
8380: 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  64].pCurrent)..#
8390: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
83a0: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
83b0: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
83c0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
83d0: 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20  lePointerEx,    
83e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
83f0: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
8400: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
8410: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8440: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
8450: 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57  interEx ((BOOL(W
8460: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
8470: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a  ARGE_INTEGER, \.
8480: 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49          PLARGE_I
8490: 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53  NTEGER,DWORD))aS
84a0: 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72  yscall[65].pCurr
84b0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
84c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
84d0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
84e0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
84f0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e  YSCALL)GetFileIn
8500: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8510: 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  eEx, 0 },.#else.
8520: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
8530: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
8540: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  x", (SYSCALL)0, 
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8570: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49  efine osGetFileI
8580: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
8590: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
85a0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
85b0: 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f         FILE_INFO
85c0: 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53  _BY_HANDLE_CLASS
85d0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61  ,LPVOID,DWORD))a
85e0: 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72  Syscall[66].pCur
85f0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8600: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 28 21  E_OS_WINRT && (!
8610: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8620: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
8630: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
8640: 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  >0).  { "MapView
8650: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
8660: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
8670: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
8680: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
8690: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
86a0: 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28  leFromApp",    (
86b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
86e0: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
86f0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c  fFileFromApp ((L
8700: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
8710: 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  ANDLE,ULONG,ULON
8720: 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  G64, \.        S
8730: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
8740: 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  67].pCurrent)..#
8750: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8760: 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  RT.  { "CreateFi
8770: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
8780: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
8790: 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20  eFile2,         
87a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
87b0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
87c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
87d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8800: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
8810: 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  e2 ((HANDLE(WINA
8820: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
8830: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
8840: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41  \.        LPCREA
8850: 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
8860: 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79  _PARAMETERS))aSy
8870: 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65  scall[68].pCurre
8880: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
8890: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
88a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
88b0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
88c0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
88d0: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
88e0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63  (SYSCALL)LoadPac
88f0: 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20  kagedLibrary,   
8900: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8910: 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69   "LoadPackagedLi
8920: 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53  brary",     (SYS
8930: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8950: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8960: 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65  ne osLoadPackage
8970: 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55  dLibrary ((HMODU
8980: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
8990: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
89a0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
89b0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
89c0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
89d0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
89e0: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
89f0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
8a00: 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20  kCount64,       
8a10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8a20: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  { "GetTickCount6
8a30: 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  4",          (SY
8a40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8a60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8a70: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
8a80: 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47  nt64 ((ULONGLONG
8a90: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
8aa0: 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75  aSyscall[70].pCu
8ab0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8ac0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8ad0: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
8ae0: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
8af0: 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73  ALL)GetNativeSys
8b00: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d  temInfo,     0 }
8b10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
8b20: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8b30: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
8b40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8b50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8b60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8b70: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
8b80: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
8b90: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
8ba0: 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53  PSYSTEM_INFO))aS
8bb0: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
8bc0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
8bd0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8be0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75  AS_ANSI).  { "Ou
8bf0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
8c00: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8c10: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
8c20: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
8c30: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
8c40: 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20  DebugStringA",  
8c50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8c80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
8c90: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20  putDebugStringA 
8ca0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
8cb0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
8cc0: 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [72].pCurrent)..
8cd0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8ce0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
8cf0: 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  E).  { "OutputDe
8d00: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
8d10: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
8d20: 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20  tDebugStringW,  
8d30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8d40: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8d50: 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  tringW",      (S
8d60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8d90: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
8da0: 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44  ugStringW ((VOID
8db0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
8dc0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e  R))aSyscall[73].
8dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
8de0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c  GetProcessHeap",
8df0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8e00: 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61  LL)GetProcessHea
8e10: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
8e20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
8e30: 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e  rocessHeap ((HAN
8e40: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  DLE(WINAPI*)(VOI
8e50: 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e  D))aSyscall[74].
8e60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
8e70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8e80: 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49  & (!defined(SQLI
8e90: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
8ea0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
8eb0: 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43 72 65  SIZE>0).  { "Cre
8ec0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8ed0: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8ee0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
8ef0: 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a  ngFromApp, 0 },.
8f00: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
8f10: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
8f20: 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  App", (SYSCALL)0
8f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8f50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
8f60: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8f70: 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28  romApp ((HANDLE(
8f80: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8f90: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
8fa0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
8fb0: 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c  ,ULONG,ULONG64,L
8fc0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
8fd0: 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [75].pCurrent)..
8fe0: 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e 20 73  /*.** NOTE: On s
8ff0: 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  ome sub-platform
9000: 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f 63 6b  s, the Interlock
9010: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
9020: 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a 2a 20  e "function".** 
9030: 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c 79 20        is really 
9040: 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74 68 61  just a macro tha
9050: 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69 6c 65  t uses a compile
9060: 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65 2e 67  r intrinsic (e.g
9070: 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20 20 20  . x64)..**      
9080: 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79 20 74   So do not try t
9090: 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73 20 69  o make this is i
90a0: 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61 62 6c  nto a redefinabl
90b0: 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  e interface..*/.
90c0: 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e 74 65  #if defined(Inte
90d0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
90e0: 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49 6e 74  change).  { "Int
90f0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
9100: 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41  xchange", (SYSCA
9110: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
9120: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
9130: 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f  define osInterlo
9140: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
9150: 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43  nge InterlockedC
9160: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 0a 23  ompareExchange.#
9170: 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65 72 6c  else.  { "Interl
9180: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
9190: 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  ange", (SYSCALL)
91a0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
91b0: 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c  reExchange, 0 },
91c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65  ..#define osInte
91d0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
91e0: 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49  change ((LONG(WI
91f0: 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a 20 20  NAPI*)(LONG \.  
9200: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
9210: 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20 4c 4f  32_VOLATILE*, LO
9220: 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63 61 6c  NG,LONG))aSyscal
9230: 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[76].pCurrent).
9240: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
9250: 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  d(InterlockedCom
9260: 70 61 72 65 45 78 63 68 61 6e 67 65 29 20 2a 2f  pareExchange) */
9270: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
9280: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
9290: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51  E_OS_WINRT && SQ
92a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55  LITE_WIN32_USE_U
92b0: 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43 72 65  UID.  { "UuidCre
92c0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
92d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 75 69      (SYSCALL)Uui
92e0: 64 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  dCreate,        
92f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
9300: 20 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 22    { "UuidCreate"
9310: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9320: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
9350: 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72 65 61  efine osUuidCrea
9360: 74 65 20 28 28 52 50 43 5f 53 54 41 54 55 53 28  te ((RPC_STATUS(
9370: 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44  RPC_ENTRY*)(UUID
9380: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 37 5d 2e  *))aSyscall[77].
9390: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
93a0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
93b0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
93c0: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
93d0: 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b  N32_USE_UUID.  {
93e0: 20 22 55 75 69 64 43 72 65 61 74 65 53 65 71 75   "UuidCreateSequ
93f0: 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59  ential",     (SY
9400: 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65  SCALL)UuidCreate
9410: 53 65 71 75 65 6e 74 69 61 6c 2c 20 20 20 30 20  Sequential,   0 
9420: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75  },.#else.  { "Uu
9430: 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 69  idCreateSequenti
9440: 61 6c 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  al",     (SYSCAL
9450: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
9460: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
9470: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
9480: 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  sUuidCreateSeque
9490: 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20 20 20 20  ntial \.        
94a0: 28 28 52 50 43 5f 53 54 41 54 55 53 28 52 50 43  ((RPC_STATUS(RPC
94b0: 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a 29 29  _ENTRY*)(UUID*))
94c0: 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70 43 75  aSyscall[78].pCu
94d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
94e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
94f0: 59 4e 43 29 20 26 26 20 53 51 4c 49 54 45 5f 4d  YNC) && SQLITE_M
9500: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
9510: 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46   { "FlushViewOfF
9520: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 28  ile",          (
9530: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 56 69 65  SYSCALL)FlushVie
9540: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
9550: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
9560: 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65 22  FlushViewOfFile"
9570: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
9580: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
9590: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
95a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
95b0: 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66 46 69   osFlushViewOfFi
95c0: 6c 65 20 5c 0a 20 20 20 20 20 20 20 20 28 28 42  le \.        ((B
95d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
95e0: 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61 53 79  VOID,SIZE_T))aSy
95f0: 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72 72 65  scall[79].pCurre
9600: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
9610: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
9620: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
9630: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
9640: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
9650: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
9660: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
9670: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
9680: 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52  win32" VFSes.  R
9690: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
96a0: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
96b0: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
96c0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
96d0: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
96e0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
96f0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
9700: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
9710: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
9720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9730: 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
9740: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
9750: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
9760: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
9770: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
9780: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9790: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
97a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
97b0: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
97c0: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
97d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
97e0: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
97f0: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
9800: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
9810: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
9820: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
9830: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
9840: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
9850: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
9860: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9870: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
9880: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
9890: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
98a0: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
98b0: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
98c0: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
98d0: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
98e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
98f0: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
9900: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
9910: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
9920: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
9930: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
9940: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
9950: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
9960: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
9970: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
9980: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
9990: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
99a0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
99b0: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
99c0: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
99d0: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
99e0: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
99f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9a00: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
9a10: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
9a20: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
9a30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9a40: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9a50: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
9a70: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
9a80: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
9a90: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
9aa0: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
9ab0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9ac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9ad0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9ae0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
9af0: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
9b00: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
9b10: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
9b20: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
9b30: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
9b40: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
9b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9b60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9b70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
9b80: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
9b90: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
9ba0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
9bb0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
9bc0: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
9bd0: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
9be0: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
9bf0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
9c00: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
9c10: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
9c20: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
9c30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
9c40: 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d  ptr winGetSystem
9c50: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
9c60: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20  vfs *pNotUsed,. 
9c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9c80: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  me.){.  unsigned
9c90: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45   int i;..  UNUSE
9ca0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
9cb0: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Used);.  for(i=0
9cc0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
9cd0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
9ce0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
9cf0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
9d00: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
9d10: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  ].zName)==0 ) re
9d20: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9d30: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20  .pCurrent;.  }. 
9d40: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9d50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
9d60: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9d70: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74   system call aft
9d80: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e  er zName.  If zN
9d90: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65  ame==NULL.** the
9da0: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  n return the nam
9db0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
9dc0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
9dd0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
9de0: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  e.** is the last
9df0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20   system call or 
9e00: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
9e10: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
9e20: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  lid.** system ca
9e30: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ll..*/.static co
9e40: 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78  nst char *winNex
9e50: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
9e60: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
9e70: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
9e80: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
9e90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9ea0: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
9eb0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
9ec0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
9ed0: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
9ee0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
9ef0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
9f00: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
9f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9f20: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
9f30: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
9f40: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
9f50: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
9f60: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
9f70: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
9f80: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
9f90: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn 0;.}..#ifdef 
9fa0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9fb0: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57  LOC./*.** If a W
9fc0: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9fd0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
9fe0: 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ured, this funct
9ff0: 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  ion will attempt
a000: 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69   to.** compact i
a010: 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73  t.  Upon success
a020: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c  , SQLITE_OK will
a030: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55   be returned.  U
a040: 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65  pon failure, one
a050: 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f  .** of SQLITE_NO
a060: 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  MEM, SQLITE_ERRO
a070: 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  R, or SQLITE_NOT
a080: 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65  FOUND will be re
a090: 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20  turned.  The.** 
a0a0: 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75  "pnLargest" argu
a0b0: 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72  ment, if non-zer
a0c0: 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  o, will be used 
a0d0: 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73 69  to return the si
a0e0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72  ze of the.** lar
a0f0: 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66  gest committed f
a100: 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65  ree block in the
a110: 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e   heap, in bytes.
a120: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a130: 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65  win32_compact_he
a140: 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67  ap(LPUINT pnLarg
a150: 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
a160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49   SQLITE_OK;.  UI
a170: 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b  NT nLargest = 0;
a180: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
a190: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
a1a0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
a1b0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
a1c0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
a1d0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
a1e0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
a1f0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
a200: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
a210: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
a220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
a230: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
a240: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
a250: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
a260: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
a270: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
a280: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53  );.#endif.#if !S
a290: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
a2a0: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
a2b0: 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65  RT.  if( (nLarge
a2c0: 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74  st=osHeapCompact
a2d0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
a2e0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29  IN32_HEAP_FLAGS)
a2f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52  )==0 ){.    DWOR
a300: 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  D lastErrno = os
a310: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
a320: 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
a330: 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20  o==NO_ERROR ){. 
a340: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
a350: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
a360: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
a370: 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29  mpact (no space)
a380: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
a3a0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20  oid*)hHeap);.   
a3b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a3c0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
a3d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
a3e0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
a3f0: 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f  RROR, "failed to
a400: 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c   HeapCompact (%l
a410: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
a440: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
a450: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a460: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
a470: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69    }.#else.  sqli
a480: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
a490: 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64  OTFOUND, "failed
a4a0: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c   to HeapCompact,
a4b0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
a4c0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
a4d0: 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53  hHeap);.  rc = S
a4e0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
a4f0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c  #endif.  if( pnL
a500: 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67  argest ) *pnLarg
a510: 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a  est = nLargest;.
a520: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a530: 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32  /*.** If a Win32
a540: 20 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73   native heap has
a550: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a560: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
a570: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
a580: 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  ** destroy and r
a590: 65 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20  ecreate it.  If 
a5a0: 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  the Win32 native
a5b0: 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f   heap is not iso
a5c0: 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20  lated and/or.** 
a5d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  the sqlite3_memo
a5e0: 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69  ry_used() functi
a5f0: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75  on does not retu
a600: 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f  rn zero, SQLITE_
a610: 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  BUSY will.** be 
a620: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
a630: 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
a640: 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33  made to the Win3
a650: 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a  2 native heap..*
a660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
a670: 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29  n32_reset_heap()
a680: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55  {.  int rc;.  MU
a690: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
a6a0: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
a6b0: 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e  r; ) /* The main
a6c0: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
a6d0: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a6e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a6f0: 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65  Mem; )    /* The
a700: 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d   memsys static m
a710: 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  utex */.  MUTEX_
a720: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
a730: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
a740: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a750: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
a760: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
a770: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d   pMem = sqlite3M
a780: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
a790: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
a7a0: 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  M); ).  sqlite3_
a7b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
a7c0: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ter);.  sqlite3_
a7d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d  mutex_enter(pMem
a7e0: 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  );.  winMemAsser
a7f0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20  tMagic();.  if( 
a800: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21  winMemGetHeap()!
a810: 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47  =NULL && winMemG
a820: 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c  etOwned() && sql
a830: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a840: 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  ()==0 ){.    /*.
a850: 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
a860: 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75  oint, there shou
a870: 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  ld be no outstan
a880: 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ding memory allo
a890: 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a  cations on.    *
a8a0: 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73  * the heap.  Als
a8b0: 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68  o, since both th
a8c0: 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d  e master and mem
a8d0: 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75  sys locks are cu
a8e0: 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62  rrently.    ** b
a8f0: 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c  eing held by us,
a900: 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69   no other functi
a910: 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e  on (i.e. from an
a920: 6f 74 68 65 72 20 74 68 72 65 61 64 29 20 73 68  other thread) sh
a930: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61  ould.    ** be a
a940: 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65  ble to even acce
a950: 73 73 20 74 68 65 20 68 65 61 70 2e 20 20 41 74  ss the heap.  At
a960: 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79  tempt to destroy
a970: 20 61 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75   and recreate ou
a980: 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65  r.    ** isolate
a990: 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  d Win32 native h
a9a0: 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  eap now..    */.
a9b0: 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d      assert( winM
a9c0: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
a9d0: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
a9e0: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
a9f0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
aa00: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
aa10: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
aa20: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
aa30: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
aa40: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
aa50: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
aa60: 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73  ==NULL );.    as
aa70: 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74  sert( !winMemGet
aa80: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
aa90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
aaa0: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
aab0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d  );.    rc = winM
aac0: 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74  emInit(winMemGet
aad0: 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20  DataPtr());.    
aae0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
aaf0: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
ab00: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
ab10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
ab20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77  !=SQLITE_OK || w
ab30: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
ab40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
ab50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
ab60: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
ab70: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65  sed()==0 );.  }e
ab80: 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse{.    /*.    
ab90: 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74  ** The Win32 nat
aba0: 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20  ive heap cannot 
abb0: 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61  be modified beca
abc0: 75 73 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e  use it may be in
abd0: 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   use..    */.   
abe0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
abf0: 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
ac00: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65  _mutex_leave(pMe
ac10: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  m);.  sqlite3_mu
ac20: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
ac30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
ac40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ac50: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
ac60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
ac70: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
ac80: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
ac90: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
aca0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
acb0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
acc0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
acd0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
ace0: 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63  te_debug(const c
acf0: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
ad00: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62  Buf){.  char zDb
ad10: 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33  gBuf[SQLITE_WIN3
ad20: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b  2_DBG_BUF_SIZE];
ad30: 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
ad40: 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f  N(nBuf, (SQLITE_
ad50: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
ad60: 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79  ZE - 1)); /* may
ad70: 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f   be negative. */
ad80: 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29  .  if( nMin<-1 )
ad90: 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61   nMin = -1; /* a
ada0: 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  ll negative valu
adb0: 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f  es become -1. */
adc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d  .  assert( nMin=
add0: 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c  =-1 || nMin==0 |
ade0: 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49  | nMin<SQLITE_WI
adf0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
ae00: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
ae10: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
ae20: 4f 52 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29  OR.  if( !zBuf )
ae30: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
ae40: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
ae50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ae60: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
ae70: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
ae80: 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20  HAS_ANSI).  if( 
ae90: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
aea0: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
aeb0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
aec0: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
aed0: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
aee0: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
aef0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
af00: 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b  tringA(zDbgBuf);
af10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73  .  }else{.    os
af20: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
af30: 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  gA(zBuf);.  }.#e
af40: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
af50: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
af60: 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  E).  memset(zDbg
af70: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
af80: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
af90: 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c  E);.  if ( osMul
afa0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
afb0: 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72  (.          osAr
afc0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
afd0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
afe0: 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20  MCP, 0, zBuf,.  
aff0: 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c          nMin, (L
b000: 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53  PWSTR)zDbgBuf, S
b010: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
b020: 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28  BUF_SIZE/sizeof(
b030: 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20  WCHAR))<=0 ){.  
b040: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b050: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
b060: 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44  ingW((LPCWSTR)zD
b070: 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20  bgBuf);.#else.  
b080: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
b090: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
b0a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
b0b0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
b0c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
b0d0: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
b0e0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
b0f0: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67  derr, "%s", zDbg
b100: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
b110: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
b120: 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  r, "%s", zBuf);.
b130: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
b140: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
b150: 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e  g routine suspen
b160: 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ds the current t
b170: 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61  hread for at lea
b180: 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65  st ms.** millise
b190: 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20  conds.  This is 
b1a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
b1b0: 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20  e Win32 Sleep() 
b1c0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
b1d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b1e0: 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20  T.static HANDLE 
b1f0: 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
b200: 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71  .#endif..void sq
b210: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
b220: 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63  p(DWORD millisec
b230: 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54  onds){.#if SQLIT
b240: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20  E_OS_WINRT.  if 
b250: 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c  ( sleepObj==NULL
b260: 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a   ){.    sleepObj
b270: 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74   = osCreateEvent
b280: 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ExW(NULL, NULL, 
b290: 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e  CREATE_EVENT_MAN
b2a0: 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20  UAL_RESET,.     
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48             SYNCH
b2d0: 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61  RONIZE);.  }.  a
b2e0: 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21  ssert( sleepObj!
b2f0: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69  =NULL );.  osWai
b300: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
b310: 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c  Ex(sleepObj, mil
b320: 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45  liseconds, FALSE
b330: 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65  );.#else.  osSle
b340: 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  ep(milliseconds)
b350: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
b360: 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
b370: 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21  R_THREADS>0 && !
b380: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
b390: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
b3a0: 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20  NRT && \.       
b3b0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
b3c0: 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74  FE>0.DWORD sqlit
b3d0: 65 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44  e3Win32Wait(HAND
b3e0: 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44  LE hObject){.  D
b3f0: 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65  WORD rc;.  while
b400: 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f  ( (rc = osWaitFo
b410: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
b420: 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54  hObject, INFINIT
b430: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29            TRUE))
b460: 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45  ==WAIT_IO_COMPLE
b470: 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72  TION ){}.  retur
b480: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
b490: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b4a0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
b4b0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
b4c0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
b4d0: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
b4e0: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
b4f0: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
b500: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
b510: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
b520: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
b530: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
b540: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
b550: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
b560: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
b570: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
b580: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
b590: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
b5a0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
b5b0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
b5c0: 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20  't call it when 
b5d0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
b5e0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
b5f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
b600: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
b610: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
b620: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
b630: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
b640: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
b650: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
b660: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
b670: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
b680: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b690: 2e 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54  ..*/..#if !SQLIT
b6a0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
b6b0: 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73  ONEX.# define os
b6c0: 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  IsNT()  (1).#eli
b6d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
b6e0: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
b6f0: 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64  INRT || !defined
b700: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
b710: 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65  S_ANSI).# define
b720: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
b730: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  elif !defined(SQ
b740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
b750: 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  IDE).# define os
b760: 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73  IsNT()  (0).#els
b770: 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  e.# define osIsN
b780: 54 28 29 20 20 28 28 73 71 6c 69 74 65 33 5f 6f  T()  ((sqlite3_o
b790: 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71  s_type==2) || sq
b7a0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e  lite3_win32_is_n
b7b0: 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t()).#endif../*.
b7c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b7d0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 74   determines if t
b7e0: 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 72 75  he machine is ru
b7f0: 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20  nning a version 
b800: 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61  of Windows.** ba
b810: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
b820: 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnel..*/.int sql
b830: 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74  ite3_win32_is_nt
b840: 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49  (void){.#if SQLI
b850: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 2f 2a  TE_OS_WINRT.  /*
b860: 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68 65 20  .  ** NOTE: The 
b870: 57 69 6e 52 54 20 73 75 62 2d 70 6c 61 74 66 6f  WinRT sub-platfo
b880: 72 6d 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  rm is always ass
b890: 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64  umed to be based
b8a0: 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a 2a 20   on the NT.  ** 
b8b0: 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a 20 20        kernel..  
b8c0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  */.  return 1;.#
b8d0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  elif SQLITE_WIN3
b8e0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20  2_GETVERSIONEX. 
b8f0: 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f 63 6b   if( osInterlock
b900: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
b910: 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  e(&sqlite3_os_ty
b920: 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  pe, 0, 0)==0 ){.
b930: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
b940: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
b950: 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  I).    OSVERSION
b960: 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOA sInfo;.   
b970: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
b980: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
b990: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
b9a0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28  osGetVersionExA(
b9b0: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49  &sInfo);.    osI
b9c0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
b9d0: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
b9e0: 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20  e3_os_type,.    
b9f0: 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61      (sInfo.dwPla
ba00: 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50  tformId == VER_P
ba10: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
ba20: 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23  ) ? 2 : 1, 0);.#
ba30: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
ba40: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
ba50: 44 45 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f  DE).    OSVERSIO
ba60: 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20  NINFOW sInfo;.  
ba70: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
ba80: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
ba90: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
baa0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57   osGetVersionExW
bab0: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73  (&sInfo);.    os
bac0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bad0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bae0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20  te3_os_type,.   
baf0: 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c       (sInfo.dwPl
bb00: 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f  atformId == VER_
bb10: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
bb20: 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a  T) ? 2 : 1, 0);.
bb30: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
bb40: 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  urn osInterlocke
bb50: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
bb60: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
bb70: 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c  e, 2, 2)==2;.#el
bb80: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
bb90: 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c   return osInterl
bba0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
bbb0: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
bbc0: 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b  _type, 2, 2)==2;
bbd0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a  .#else.  /*.  **
bbe0: 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62 2d 70   NOTE: All sub-p
bbf0: 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20 74  latforms where t
bc00: 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b  he GetVersionEx[
bc10: 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  AW] functions ar
bc20: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 64 65 70  e.  **       dep
bc30: 72 65 63 61 74 65 64 20 61 72 65 20 61 6c 77 61  recated are alwa
bc40: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
bc50: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
bc60: 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20   kernel..  */.  
bc70: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
bc80: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
bc90: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f  E_WIN32_MALLOC./
bca0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
bcb0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a  ytes of memory..
bcc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
bcd0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
bce0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
bcf0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
bd00: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
bd10: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
bd20: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
bd30: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
bd40: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
bd50: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
bd60: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
bd70: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
bd80: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
bd90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
bda0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
bdb0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
bdc0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
bdd0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
bde0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
bdf0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
be00: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
be10: 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61  0 );.  p = osHea
be20: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
be30: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
be40: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
be50: 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70  Bytes);.  if( !p
be60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
be70: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
be80: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
be90: 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20  pAlloc %u bytes 
bea0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
beb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bec0: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
bed0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
bee0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
bef0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
bf00: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a  ** Free memory..
bf10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
bf20: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
bf30: 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c  pPrior){.  HANDL
bf40: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
bf50: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
bf60: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
bf70: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
bf80: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
bf90: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bfa0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
bfb0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
bfc0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
bfd0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
bfe0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
bff0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c000: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c010: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
c020: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c030: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
c040: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
c050: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
c060: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
c070: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
c080: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
c090: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
c0a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c0b0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
c0c0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
c0d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c0e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
c0f0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
c100: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
c110: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c120: 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c    pPrior, osGetL
c130: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
c140: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d  d*)hHeap);.  }.}
c150: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c160: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
c170: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
c180: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
c190: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
c1a0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
c1b0: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
c1c0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
c1d0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
c1e0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
c1f0: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
c200: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
c210: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
c220: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c230: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
c240: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
c250: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c260: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
c270: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
c280: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
c290: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
c2a0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
c2b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
c2c0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
c2d0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
c2e0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
c2f0: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
c300: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
c310: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
c320: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c330: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
c340: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
c350: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
c360: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
c370: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c380: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
c390: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
c3a0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
c3b0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c3c0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
c3d0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
c3e0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
c3f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
c400: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
c410: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
c420: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
c430: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c440: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c450: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
c460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c480: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
c490: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
c4a0: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
c4b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
c4c0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
c4d0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
c4e0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
c4f0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
c500: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
c510: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
c520: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
c530: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
c540: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
c550: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
c560: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
c570: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
c580: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
c590: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
c5a0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
c5b0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
c5c0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c5d0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b  EAP_FLAGS, p) );
c5e0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
c5f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
c600: 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48   = osHeapSize(hH
c610: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c620: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
c630: 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45  ;.  if( n==(SIZE
c640: 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c  _T)-1 ){.    sql
c650: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c660: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
c670: 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b  o HeapSize block
c680: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
c690: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
c6a0: 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73       p, osGetLas
c6b0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
c6c0: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74  )hHeap);.    ret
c6d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
c6e0: 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f  urn (int)n;.}../
c6f0: 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20  *.** Round up a 
c700: 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20  request size to 
c710: 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61  the next valid a
c720: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a  llocation size..
c730: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
c740: 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20  nMemRoundup(int 
c750: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  n){.  return n;.
c760: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
c770: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
c780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c790: 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  inMemInit(void *
c7a0: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
c7b0: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
c7c0: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
c7d0: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
c7e0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
c7f0: 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ta ) return SQLI
c800: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65  TE_ERROR;.  asse
c810: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c820: 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f  >magic1==WINMEM_
c830: 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65  MAGIC1 );.  asse
c840: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c850: 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f  >magic2==WINMEM_
c860: 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21  MAGIC2 );..#if !
c870: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c880: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
c890: 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66  HEAP_CREATE.  if
c8a0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
c8b0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f  hHeap ){.    DWO
c8c0: 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  RD dwInitialSize
c8d0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
c8e0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a  HEAP_INIT_SIZE;.
c8f0: 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69      DWORD dwMaxi
c900: 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44  mumSize = (DWORD
c910: 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  )sqlite3GlobalCo
c920: 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20  nfig.nHeap;.    
c930: 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  if( dwMaximumSiz
c940: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77  e==0 ){.      dw
c950: 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51  MaximumSize = SQ
c960: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c970: 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65  MAX_SIZE;.    }e
c980: 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74 69 61  lse if( dwInitia
c990: 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53  lSize>dwMaximumS
c9a0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49  ize ){.      dwI
c9b0: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d  nitialSize = dwM
c9c0: 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20  aximumSize;.    
c9d0: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
c9e0: 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61  a->hHeap = osHea
c9f0: 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57  pCreate(SQLITE_W
ca00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ca10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c         dwInitial
ca40: 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53  Size, dwMaximumS
ca50: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
ca60: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
ca70: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
ca80: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
ca90: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22  MEM,.          "
caa0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72  failed to HeapCr
cab0: 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67  eate (%lu), flag
cac0: 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25  s=%u, initSize=%
cad0: 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22  lu, maxSize=%lu"
cae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  ,.          osGe
caf0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51  tLastError(), SQ
cb00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
cb10: 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c  FLAGS, dwInitial
cb20: 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
cb30: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
cb40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
cb50: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
cb60: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
cb70: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
cb80: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74  TRUE;.    assert
cb90: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
cba0: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c  Owned );.  }.#el
cbb0: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  se.  pWinMemData
cbc0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50  ->hHeap = osGetP
cbd0: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20  rocessHeap();.  
cbe0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
cbf0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73  ->hHeap ){.    s
cc00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
cc10: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
cc20: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50   "failed to GetP
cc30: 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29  rocessHeap (%lu)
cc40: 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ", osGetLastErro
cc50: 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r());.    return
cc60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
cc70: 50 54 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65  PT;.  }.  pWinMe
cc80: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
cc90: 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28  FALSE;.  assert(
cca0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62   !pWinMemData->b
ccb0: 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a  Owned );.#endif.
ccc0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
ccd0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20  mData->hHeap!=0 
cce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
ccf0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
cd00: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
cd10: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
cd20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
cd30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
cd40: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
cd50: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
cd60: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
cd70: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
cd80: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
cd90: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
cda0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
cdb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cdc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
cdd0: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
cde0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
cdf0: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
ce00: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
ce10: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
ce20: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
ce30: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
ce40: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
ce50: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
ce60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
ce70: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
ce80: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
ce90: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
cea0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
ceb0: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
cec0: 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e  2 );..  if( pWin
ced0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
cee0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
cef0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cf00: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
cf10: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
cf20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
cf30: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
cf40: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
cf50: 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65  LIDATE).    asse
cf60: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
cf70: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
cf80: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
cf90: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
cfa0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
cfb0: 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44      if( pWinMemD
cfc0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20  ata->bOwned ){. 
cfd0: 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70       if( !osHeap
cfe0: 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44  Destroy(pWinMemD
cff0: 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20  ata->hHeap) ){. 
d000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
d010: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
d020: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
d030: 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68  Destroy (%lu), h
d040: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
d060: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
d070: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
d080: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
d090: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
d0a0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
d0b0: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
d0c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
d0d0: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
d0e0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
d0f0: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
d100: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d110: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
d120: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
d130: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
d140: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
d150: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
d160: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
d170: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
d180: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
d190: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
d1a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
d1b0: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
d1c0: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
d1d0: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
d1e0: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
d1f0: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
d200: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
d210: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
d220: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
d230: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
d240: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
d250: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d260: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
d270: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
d280: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
d290: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
d2a0: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
d2b0: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
d2c0: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
d2d0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
d2e0: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
d2f0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
d300: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
d310: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
d320: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
d330: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
d340: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
d350: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
d360: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
d370: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
d380: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
d390: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
d3a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
d3b0: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
d3c0: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
d3d0: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
d3e0: 74 20 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  t Unicode..**.**
d3f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d400: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d410: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d420: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d430: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
d440: 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f  LPWSTR winUtf8To
d450: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
d460: 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 69 6e  ar *zText){.  in
d470: 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
d480: 52 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a 20 20  R zWideText;..  
d490: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
d4a0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
d4b0: 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c  _UTF8, 0, zText,
d4c0: 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20   -1, NULL, 0);. 
d4d0: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
d4e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d4f0: 20 7d 0a 20 20 7a 57 69 64 65 54 65 78 74 20 3d   }.  zWideText =
d500: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
d510: 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  ro( nChar*sizeof
d520: 28 57 43 48 41 52 29 20 29 3b 0a 20 20 69 66 28  (WCHAR) );.  if(
d530: 20 7a 57 69 64 65 54 65 78 74 3d 3d 30 20 29 7b   zWideText==0 ){
d540: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d550: 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d   }.  nChar = osM
d560: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
d570: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
d580: 54 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64 65 54  Text, -1, zWideT
d590: 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
d5c0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
d5d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d5e0: 7a 57 69 64 65 54 65 78 74 29 3b 0a 20 20 20 20  zWideText);.    
d5f0: 7a 57 69 64 65 54 65 78 74 20 3d 20 30 3b 0a 20  zWideText = 0;. 
d600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64   }.  return zWid
d610: 65 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eText;.}../*.** 
d620: 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73  Convert a Micros
d630: 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69  oft Unicode stri
d640: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a  ng to UTF-8..**.
d650: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
d660: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
d670: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d680: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d690: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
d6a0: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
d6b0: 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52  deToUtf8(LPCWSTR
d6c0: 20 7a 57 69 64 65 54 65 78 74 29 7b 0a 20 20 69   zWideText){.  i
d6d0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
d6e0: 20 2a 7a 54 65 78 74 3b 0a 0a 20 20 6e 42 79 74   *zText;..  nByt
d6f0: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
d700: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
d710: 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c  8, 0, zWideText,
d720: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
d730: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
d740: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
d750: 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20   0;.  }.  zText 
d760: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
d770: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
d780: 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a  if( zText==0 ){.
d790: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d7a0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  }.  nByte = osWi
d7b0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
d7c0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
d7d0: 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65  ideText, -1, zTe
d7e0: 78 74 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  xt, nByte,.     
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
d810: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
d820: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
d830: 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20  3_free(zText);. 
d840: 20 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20     zText = 0;.  
d850: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74  }.  return zText
d860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d870: 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e  rt an ANSI strin
d880: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
d890: 6e 69 63 6f 64 65 2c 20 75 73 69 6e 67 20 74 68  nicode, using th
d8a0: 65 20 41 4e 53 49 20 6f 72 20 4f 45 4d 0a 2a 2a  e ANSI or OEM.**
d8b0: 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a   code page..**.*
d8c0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
d8d0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d8e0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d8f0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d900: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
d910: 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54   LPWSTR winMbcsT
d920: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
d930: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
d940: 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20  useAnsi){.  int 
d950: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
d960: 7a 4d 62 63 73 54 65 78 74 3b 0a 20 20 69 6e 74  zMbcsText;.  int
d970: 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73 65 41   codepage = useA
d980: 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  nsi ? CP_ACP : C
d990: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
d9a0: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
d9b0: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
d9c0: 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31  ge, 0, zText, -1
d9d0: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f          0)*sizeo
da00: 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20  f(WCHAR);.  if( 
da10: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
da20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
da30: 7a 4d 62 63 73 54 65 78 74 20 3d 20 73 71 6c 69  zMbcsText = sqli
da40: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
da50: 42 79 74 65 2a 73 69 7a 65 6f 66 28 57 43 48 41  Byte*sizeof(WCHA
da60: 52 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63  R) );.  if( zMbc
da70: 73 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sText==0 ){.    
da80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
da90: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
daa0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
dab0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74  depage, 0, zText
dac0: 2c 20 2d 31 2c 20 7a 4d 62 63 73 54 65 78 74 2c  , -1, zMbcsText,
dad0: 0a 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 20 20 20 20                  
daf0: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
db00: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
db10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
db20: 73 54 65 78 74 29 3b 0a 20 20 20 20 7a 4d 62 63  sText);.    zMbc
db30: 73 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sText = 0;.  }. 
db40: 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 54 65 78   return zMbcsTex
db50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  t;.}../*.** Conv
db60: 65 72 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20  ert a Microsoft 
db70: 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74  Unicode string t
db80: 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  o a multi-byte c
db90: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
dba0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 4e  .** using the AN
dbb0: 53 49 20 6f 72 20 4f 45 4d 20 63 6f 64 65 20 70  SI or OEM code p
dbc0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
dbd0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
dbe0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
dbf0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
dc00: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
dc10: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
dc20: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
dc30: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54 65  (LPCWSTR zWideTe
dc40: 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29  xt, int useAnsi)
dc50: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
dc60: 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20   char *zText;.  
dc70: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75  int codepage = u
dc80: 73 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20  seAnsi ? CP_ACP 
dc90: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
dca0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
dcb0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
dcc0: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54  epage, 0, zWideT
dcd0: 65 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ext, -1, 0, 0, 0
dce0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
dcf0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65  e == 0 ){.    re
dd00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54  turn 0;.  }.  zT
dd10: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ext = sqlite3Mal
dd20: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
dd30: 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30  ;.  if( zText==0
dd40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
dd50: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
dd60: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
dd70: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
dd80: 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31  0, zWideText, -1
dd90: 2c 20 7a 54 65 78 74 2c 0a 20 20 20 20 20 20 20  , zText,.       
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
ddc0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
ddd0: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
dde0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78  qlite3_free(zTex
ddf0: 74 29 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d 20  t);.    zText = 
de00: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
de10: 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zText;.}../*.** 
de20: 43 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74 69 2d  Convert a multi-
de30: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
de40: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a  tring to UTF-8..
de50: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
de60: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
de70: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
de80: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
de90: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
dea0: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 4d 62  atic char *winMb
deb0: 63 73 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 63  csToUtf8(const c
dec0: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
ded0: 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72  useAnsi){.  char
dee0: 20 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20 20 4c   *zTextUtf8;.  L
def0: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
df00: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69  .  zTmpWide = wi
df10: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a  nMbcsToUnicode(z
df20: 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a  Text, useAnsi);.
df30: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
df40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
df50: 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 55 74  0;.  }.  zTextUt
df60: 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  f8 = winUnicodeT
df70: 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b  oUtf8(zTmpWide);
df80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
df90: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
dfa0: 75 72 6e 20 7a 54 65 78 74 55 74 66 38 3b 0a 7d  urn zTextUtf8;.}
dfb0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
dfc0: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
dfd0: 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  o a multi-byte c
dfe0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e  haracter string.
dff0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
e000: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
e010: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
e020: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
e030: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
e040: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
e050: 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20  tf8ToMbcs(const 
e060: 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
e070: 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61   useAnsi){.  cha
e080: 72 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a 20 20  r *zTextMbcs;.  
e090: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
e0a0: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77  ..  zTmpWide = w
e0b0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
e0c0: 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20 7a 54  zText);.  if( zT
e0d0: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
e0e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
e0f0: 20 7a 54 65 78 74 4d 62 63 73 20 3d 20 77 69 6e   zTextMbcs = win
e100: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54  UnicodeToMbcs(zT
e110: 6d 70 57 69 64 65 2c 20 75 73 65 41 6e 73 69 29  mpWide, useAnsi)
e120: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
e130: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
e140: 74 75 72 6e 20 7a 54 65 78 74 4d 62 63 73 3b 0a  turn zTextMbcs;.
e150: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e160: 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65   a public wrappe
e170: 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66  r for the winUtf
e180: 38 54 6f 55 6e 69 63 6f 64 65 28 29 20 66 75 6e  8ToUnicode() fun
e190: 63 74 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53 54 52  ction..*/.LPWSTR
e1a0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
e1b0: 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63  tf8_to_unicode(c
e1c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
e1d0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e1e0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e1f0: 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29  R.  if( !zText )
e200: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
e210: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e220: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
e230: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
e240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e250: 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69  OINIT.  if( sqli
e260: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
e270: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
e280: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e  dif.  return win
e290: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 54  Utf8ToUnicode(zT
e2a0: 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ext);.}../*.** T
e2b0: 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20  his is a public 
e2c0: 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20  wrapper for the 
e2d0: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
e2e0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
e2f0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
e300: 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75  n32_unicode_to_u
e310: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
e320: 65 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53  eText){.#ifdef S
e330: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e340: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 57  _ARMOR.  if( !zW
e350: 69 64 65 54 65 78 74 20 29 7b 0a 20 20 20 20 28  ideText ){.    (
e360: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e370: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e380: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
e390: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e3a0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
e3b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
e3c0: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
e3d0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
e3e0: 65 74 75 72 6e 20 77 69 6e 55 6e 69 63 6f 64 65  eturn winUnicode
e3f0: 54 6f 55 74 66 38 28 7a 57 69 64 65 54 65 78 74  ToUtf8(zWideText
e400: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e410: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
e420: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
e430: 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e  MbcsToUtf8() fun
e440: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e450: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
e460: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
e470: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23   char *zText){.#
e480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e490: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e4a0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
e4b0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e4c0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e4d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
e4e0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e4f0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e500: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
e510: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
e520: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e530: 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73    return winMbcs
e540: 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 6f 73  ToUtf8(zText, os
e550: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
e560: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
e570: 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72  s is a public wr
e580: 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69  apper for the wi
e590: 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66 75  nMbcsToUtf8() fu
e5a0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
e5b0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
e5c0: 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63  bcs_to_utf8_v2(c
e5d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
e5e0: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
e5f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e600: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e610: 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20   if( !zText ){. 
e620: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
e630: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
e640: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
e650: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
e660: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
e670: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
e680: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
e690: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e6a0: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63  .  return winMbc
e6b0: 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 75  sToUtf8(zText, u
e6c0: 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  seAnsi);.}../*.*
e6d0: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
e6e0: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
e6f0: 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73  he winUtf8ToMbcs
e700: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
e710: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
e720: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
e730: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
e740: 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt){.#ifdef SQLI
e750: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e760: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
e770: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e780: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e790: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e7a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e7b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e7c0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e7d0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e7e0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e7f0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e800: 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65  inUtf8ToMbcs(zTe
e810: 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69  xt, osAreFileApi
e820: 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a  sANSI());.}../*.
e830: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62  ** This is a pub
e840: 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20  lic wrapper for 
e850: 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63  the winUtf8ToMbc
e860: 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  s() function..*/
e870: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
e880: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
e890: 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  s_v2(const char 
e8a0: 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41  *zText, int useA
e8b0: 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nsi){.#ifdef SQL
e8c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e8d0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78  RMOR.  if( !zTex
e8e0: 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  t ){.    (void)S
e8f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e900: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e910: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
e920: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e930: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
e940: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e950: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
e960: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e970: 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54  winUtf8ToMbcs(zT
e980: 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 7d  ext, useAnsi);.}
e990: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e9a0: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  ction is the sam
e9b0: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 77 69 6e  e as sqlite3_win
e9c0: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
e9d0: 20 28 62 65 6c 6f 77 29 3b 20 68 6f 77 65 76 65   (below); howeve
e9e0: 72 2c 0a 2a 2a 20 69 74 20 61 63 63 65 70 74 73  r,.** it accepts
e9f0: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e   a UTF-8 string.
ea00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
ea10: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
ea20: 6f 72 79 38 28 0a 20 20 75 6e 73 69 67 6e 65 64  ory8(.  unsigned
ea30: 20 6c 6f 6e 67 20 74 79 70 65 2c 20 2f 2a 20 49   long type, /* I
ea40: 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 64 69  dentifier for di
ea50: 72 65 63 74 6f 72 79 20 62 65 69 6e 67 20 73 65  rectory being se
ea60: 74 20 6f 72 20 72 65 73 65 74 20 2a 2f 0a 20 20  t or reset */.  
ea70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
ea80: 75 65 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65  ue  /* New value
ea90: 20 66 6f 72 20 64 69 72 65 63 74 6f 72 79 20 62   for directory b
eaa0: 65 69 6e 67 20 73 65 74 20 6f 72 20 72 65 73 65  eing set or rese
eab0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
eac0: 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30  *ppDirectory = 0
ead0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
eae0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
eaf0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
eb00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
eb10: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
eb20: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69  n rc;.#endif.  i
eb30: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
eb40: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
eb50: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
eb60: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
eb70: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
eb80: 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20  ectory;.  }else 
eb90: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
eba0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
ebb0: 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20  CTORY_TYPE ){.  
ebc0: 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20    ppDirectory = 
ebd0: 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  &sqlite3_temp_di
ebe0: 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61  rectory;.  }.  a
ebf0: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74  ssert( !ppDirect
ec00: 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c  ory || type==SQL
ec10: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
ec20: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20  IRECTORY_TYPE.  
ec30: 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d          || type=
ec40: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
ec50: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
ec60: 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  E.  );.  assert(
ec70: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
ec80: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
ec90: 48 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63  HasType(*ppDirec
eca0: 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45  tory, MEMTYPE_HE
ecb0: 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44  AP) );.  if( ppD
ecc0: 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
ecd0: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b  char *zCopy = 0;
ece0: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
ecf0: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
ed00: 20 20 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71        zCopy = sq
ed10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
ed20: 73 22 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20  s", zValue);.   
ed30: 20 20 20 69 66 20 28 20 7a 43 6f 70 79 3d 3d 30     if ( zCopy==0
ed40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ed50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
ed60: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
ed70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ed80: 66 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72  free(*ppDirector
ed90: 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63  y);.    *ppDirec
eda0: 74 6f 72 79 20 3d 20 7a 43 6f 70 79 3b 0a 20 20  tory = zCopy;.  
edb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
edc0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
edd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
ede0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
edf0: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  ction is the sam
ee00: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 77 69 6e  e as sqlite3_win
ee10: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
ee20: 20 28 62 65 6c 6f 77 29 3b 20 68 6f 77 65 76 65   (below); howeve
ee30: 72 2c 0a 2a 2a 20 69 74 20 61 63 63 65 70 74 73  r,.** it accepts
ee40: 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67   a UTF-16 string
ee50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ee60: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
ee70: 74 6f 72 79 31 36 28 0a 20 20 75 6e 73 69 67 6e  tory16(.  unsign
ee80: 65 64 20 6c 6f 6e 67 20 74 79 70 65 2c 20 2f 2a  ed long type, /*
ee90: 20 49 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   Identifier for 
eea0: 64 69 72 65 63 74 6f 72 79 20 62 65 69 6e 67 20  directory being 
eeb0: 73 65 74 20 6f 72 20 72 65 73 65 74 20 2a 2f 0a  set or reset */.
eec0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 56    const void *zV
eed0: 61 6c 75 65 20 20 2f 2a 20 4e 65 77 20 76 61 6c  alue  /* New val
eee0: 75 65 20 66 6f 72 20 64 69 72 65 63 74 6f 72 79  ue for directory
eef0: 20 62 65 69 6e 67 20 73 65 74 20 6f 72 20 72 65   being set or re
ef00: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
ef10: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 55 74 66  rc;.  char *zUtf
ef20: 38 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 56 61  8 = 0;.  if( zVa
ef30: 6c 75 65 20 29 7b 0a 20 20 20 20 7a 55 74 66 38  lue ){.    zUtf8
ef40: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
ef50: 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38  _unicode_to_utf8
ef60: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 69 66  (zValue);.    if
ef70: 28 20 7a 55 74 66 38 3d 3d 30 20 29 20 72 65 74  ( zUtf8==0 ) ret
ef80: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ef90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
efa0: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
efb0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 38 28 74  set_directory8(t
efc0: 79 70 65 2c 20 7a 55 74 66 38 29 3b 0a 20 20 69  ype, zUtf8);.  i
efd0: 66 28 20 7a 55 74 66 38 20 29 20 73 71 6c 69 74  f( zUtf8 ) sqlit
efe0: 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
eff0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f010: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74  ion sets the dat
f020: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74  a directory or t
f030: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
f040: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a  ectory based on.
f050: 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ** the provided 
f060: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
f070: 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75  type argument mu
f080: 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72  st be 1 in order
f090: 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64   to set the.** d
f0a0: 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72  ata directory or
f0b0: 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   2 in order to s
f0c0: 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  et the temporary
f0d0: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65   directory.  The
f0e0: 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d   zValue.** argum
f0f0: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
f100: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
f110: 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65   to use.  The re
f120: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20  turn value will 
f130: 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  be.** SQLITE_OK 
f140: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
f150: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
f160: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
f170: 79 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  y(.  unsigned lo
f180: 6e 67 20 74 79 70 65 2c 20 2f 2a 20 49 64 65 6e  ng type, /* Iden
f190: 74 69 66 69 65 72 20 66 6f 72 20 64 69 72 65 63  tifier for direc
f1a0: 74 6f 72 79 20 62 65 69 6e 67 20 73 65 74 20 6f  tory being set o
f1b0: 72 20 72 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69  r reset */.  voi
f1c0: 64 20 2a 7a 56 61 6c 75 65 20 20 20 20 20 20 20  d *zValue       
f1d0: 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f   /* New value fo
f1e0: 72 20 64 69 72 65 63 74 6f 72 79 20 62 65 69 6e  r directory bein
f1f0: 67 20 73 65 74 20 6f 72 20 72 65 73 65 74 20 2a  g set or reset *
f200: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  /.){.  return sq
f210: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
f220: 64 69 72 65 63 74 6f 72 79 31 36 28 74 79 70 65  directory16(type
f230: 2c 20 7a 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a  , zValue);.}../*
f240: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
f250: 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61  alue of winGetLa
f260: 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73  stErrorMsg.** is
f270: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
f280: 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
f290: 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
f2a0: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
f2b0: 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
f2c0: 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
f2d0: 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  cated)..*/.stati
f2e0: 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
f2f0: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
f300: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
f310: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
f320: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
f330: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
f340: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
f350: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
f360: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
f370: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
f380: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
f390: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
f3a0: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
f3b0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
f3c0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
f3d0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
f3e0: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
f3f0: 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
f400: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
f410: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
f420: 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49  mpWide[SQLITE_WI
f430: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
f440: 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c  HARS+1];.    dwL
f450: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
f460: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
f470: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
f480: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
f4b0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
f4e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
f500: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65         zTempWide
f550: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
f570: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
f580: 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20  ERRMSG_CHARS,.  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
f5b0: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
f5c0: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
f5d0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
f5e0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
f5f0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
f600: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
f630: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
f640: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
f670: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
f680: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
f6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
f710: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
f720: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
f770: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
f780: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
f790: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
f7a0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
f7b0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
f7c0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
f7d0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
f7e0: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
f7f0: 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  8(zTempWide);.  
f800: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
f810: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69  nignMalloc();.#i
f820: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
f830: 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  RT.      /* free
f840: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
f850: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
f860: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
f870: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
f880: 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23  ee(zTempWide);.#
f890: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
f8a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
f8b0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
f8c0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
f8d0: 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Temp = NULL;.   
f8e0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
f8f0: 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54  tMessageA(FORMAT
f900: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
f910: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
f940: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
f950: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
f980: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
f990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
f9b0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29           (LPSTR)
fa20: 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20   &zTemp,.       
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
fa70: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
fa80: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
fa90: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
faa0: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
fab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
fac0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
fad0: 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  );.      zOut = 
fae0: 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54  winMbcsToUtf8(zT
faf0: 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  emp, osAreFileAp
fb00: 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 20  isANSI());.     
fb10: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
fb20: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
fb30: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
fb40: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
fb50: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
fb60: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
fb70: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
fb80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
fb90: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
fba0: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
fbb0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
fbc0: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
fbd0: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
fbe0: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
fbf0: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
fc00: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
fc10: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
fc20: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
fc30: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
fc40: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
fc50: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
fc60: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
fc70: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
fc80: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
fc90: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
fca0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
fcb0: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
fcc0: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
fcd0: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
fce0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
fcf0: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
fd00: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
fd10: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
fd20: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
fd30: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
fd40: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
fd50: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
fd60: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
fd70: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
fd80: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
fd90: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
fda0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
fdb0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
fdc0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
fdd0: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
fde0: 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d   from.** FormatM
fdf0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
fe00: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
fe10: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
fe20: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
fe30: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
fe40: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
fe50: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
fe60: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
fe70: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
fe80: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a  TE_CANTOPEN)..**
fe90: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
fea0: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
feb0: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
fec0: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
fed0: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
fee0: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
fef0: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
ff00: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
ff10: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
ff20: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
ff30: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
ff40: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
ff50: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
ff60: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
ff70: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
ff80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
ff90: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
ffa0: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
ffb0: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
ffe0: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
fff0: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
10000 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10010 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
10020 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
10030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
10040 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
10050 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
10060 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
10070 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
10080 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
10090 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
100a0 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
100b0 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
100c0 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
100d0 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
100e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
100f0 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
10100 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
10110 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10130 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10140 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
10150 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
10160 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
10170 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
10180 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
10190 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
101a0 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
101b0 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
101c0 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
101d0 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
101e0 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
101f0 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
10200 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
10210 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
10220 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
10230 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
10240 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
10250 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
10260 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
10270 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
10280 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
10290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
102a0 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
102b0 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
102c0 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
102d0 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
102e0 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
102f0 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
10300 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
10310 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
10320 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
10330 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
10340 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
10350 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10360 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
10370 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
10380 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
10390 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
103a0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
103b0 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
103c0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
103d0 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
103e0 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
103f0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
10400 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
10410 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
10420 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
10430 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
10440 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
10450 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
10460 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
10470 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
10480 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
10490 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
104a0 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
104b0 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  DELAY;../*.** Th
104c0 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
104d0 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75  try1" macro is u
104e0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
104f0 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
10500 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   I/O.** error co
10510 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  de obtained via 
10520 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69  GetLastError() i
10530 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  s eligible to be
10540 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a   retried.  It.**
10550 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65   must accept the
10560 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52   error code DWOR
10570 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72  D as its only ar
10580 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c  gument and shoul
10590 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
105a0 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
105b0 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69  r code is transi
105c0 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e  ent in nature an
105d0 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  d the operation.
105e0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
105f0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
10600 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72  e original error
10610 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75   might succeed u
10620 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74  pon being.** ret
10630 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d  ried.  The argum
10640 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
10650 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61  o should be a va
10660 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64  riable..**.** Ad
10670 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61  ditionally, a ma
10680 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f  cro named "winIo
10690 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
106a0 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49  y be defined.  I
106b0 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  f it.** is defin
106c0 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ed, it will be c
106d0 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68  onsulted only wh
106e0 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69  en the macro "wi
106f0 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
10700 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  .** returns zero
10710 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  .  The "winIoerr
10720 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
10730 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f   is completely o
10740 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d  ptional and.** m
10750 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e  ay be used to in
10760 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c  clude additional
10770 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20   error codes in 
10780 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f  the set that sho
10790 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  uld.** result in
107a0 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f   the failing I/O
107b0 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67   operation being
107c0 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20   retried by the 
107d0 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64  caller.  If.** d
107e0 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e  efined, the "win
107f0 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
10800 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62  macro must exhib
10810 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
10820 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63  ntics.** identic
10830 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74  al to those of t
10840 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
10850 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f  etry1" macro..*/
10860 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69  .#if !defined(wi
10870 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29  nIoerrCanRetry1)
10880 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72  .#define winIoer
10890 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28  rCanRetry1(a) ((
108a0 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53  (a)==ERROR_ACCES
108b0 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20  S_DENIED)       
108c0 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
108f0 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
10900 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20  N)    || \.     
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
10930 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
10940 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ION)       || \.
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
10970 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f  a)==ERROR_DEV_NO
10980 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20  T_EXIST)        
10990 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
109c0 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20  ETNAME_DELETED) 
109d0 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
10a00 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
10a10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
10a40 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b  )==ERROR_NETWORK
10a50 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23  _UNREACHABLE)).#
10a60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
10a70 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
10a80 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
10a90 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
10aa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10ab0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
10ac0 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
10ad0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
10ae0 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
10af0 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
10b00 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
10b10 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10b20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
10b30 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
10b40 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
10b50 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
10b60 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
10b70 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
10b80 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
10b90 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
10ba0 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
10bb0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10bc0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
10bd0 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
10be0 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
10bf0 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
10c00 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
10c10 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
10c20 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
10c30 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10c40 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77   }.#if defined(w
10c50 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
10c60 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e  ).  else if( win
10c70 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65  IoerrCanRetry2(e
10c80 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
10c90 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
10ca0 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
10cb0 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
10cc0 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
10cd0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10ce0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
10cf0 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
10d00 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
10d10 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
10d20 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
10d30 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
10d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10d50 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
10d60 6e 52 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65  nRetry, int line
10d70 6e 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  no){.  if( nRetr
10d80 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
10d90 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
10da0 43 45 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79  CE,.      "delay
10db0 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
10dc0 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
10dd0 74 20 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20  t at line %d",. 
10de0 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
10df0 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28  ryDelay*nRetry*(
10e00 6e 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e  nRetry+1)/2, lin
10e10 65 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  eno.    );.  }.}
10e20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 23 69 66  ../*.** This #if
10e30 20 64 6f 65 73 20 6e 6f 74 20 72 65 6c 79 20 6f   does not rely o
10e40 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 53 5f  n the SQLITE_OS_
10e50 57 49 4e 43 45 20 64 65 66 69 6e 65 20 62 65 63  WINCE define bec
10e60 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ause the.** corr
10e70 65 73 70 6f 6e 64 69 6e 67 20 73 65 63 74 69 6f  esponding sectio
10e80 6e 20 69 6e 20 22 64 61 74 65 2e 63 22 20 63 61  n in "date.c" ca
10e90 6e 6e 6f 74 20 75 73 65 20 69 74 2e 0a 2a 2f 0a  nnot use it..*/.
10ea0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10eb0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49  ITE_OMIT_LOCALTI
10ec0 4d 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  ME) && defined(_
10ed0 57 49 4e 33 32 5f 57 43 45 29 20 26 26 20 5c 0a  WIN32_WCE) && \.
10ee0 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
10ef0 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
10f00 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c  IME_API) || !SQL
10f10 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
10f20 4d 45 5f 41 50 49 29 0a 2f 2a 0a 2a 2a 20 54 68  ME_API)./*.** Th
10f30 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
10f40 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
10f50 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
10f60 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  e() function..**
10f70 20 53 6f 20 64 65 66 69 6e 65 20 61 20 73 75 62   So define a sub
10f80 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 20 20 69  stitute..*/.#  i
10f90 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
10fa0 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
10fb0 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
10fc0 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
10fd0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
10fe0 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
10ff0 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
11000 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
11010 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
11020 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
11030 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
11040 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
11050 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
11060 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
11070 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
11080 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
11090 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
110a0 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
110b0 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
110c0 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
110d0 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
110e0 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
110f0 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
11100 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
11110 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
11120 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
11130 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
11140 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
11150 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
11160 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
11170 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
11180 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
11190 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
111a0 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
111b0 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
111c0 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
111d0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
111e0 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _WINCE./********
111f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11230 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
11240 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
11250 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
11260 2a 2f 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  */.#define HANDL
11270 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
11280 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
11290 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
112a0 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
112b0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
112c0 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
112d0 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
112e0 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
112f0 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
11300 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
11310 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
11320 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
11330 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
11340 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
11350 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
11360 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
11370 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
11380 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
11390 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
113a0 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
113b0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
113c0 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
113d0 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
113e0 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
113f0 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
11400 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
11410 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
11420 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
11430 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
11440 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
11450 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63  .static int winc
11460 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
11470 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
11480 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
11490 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
114a0 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
114b0 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  e;.  DWORD lastE
114c0 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f  rrno;.  BOOL bLo
114d0 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  gged = FALSE;.  
114e0 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
114f0 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69  E;..  zName = wi
11500 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
11510 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
11520 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
11530 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
11540 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
11550 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
11560 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
11570 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11580 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61  e local lockdata
11590 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46   */.  memset(&pF
115a0 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73  ile->local, 0, s
115b0 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63  izeof(pFile->loc
115c0 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c  al));..  /* Repl
115d0 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73  ace the backslas
115e0 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  hes from the fil
115f0 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63  ename and lowerc
11600 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64  ase it.  ** to d
11610 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61  erive a mutex na
11620 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20  me. */.  zTok = 
11630 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61  osCharLowerW(zNa
11640 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54  me);.  for (;*zT
11650 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20  ok;zTok++){.    
11660 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c  if (*zTok == '\\
11670 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a  ') *zTok = '_';.
11680 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
11690 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20  /open the named 
116a0 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65  mutex */.  pFile
116b0 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65  ->hMutex = osCre
116c0 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20  ateMutexW(NULL, 
116d0 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20  FALSE, zName);. 
116e0 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
116f0 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  tex){.    pFile-
11700 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
11710 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
11720 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11730 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
11740 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
11750 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
11760 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
11790 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e  teLock1", zFilen
117a0 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ame);.  }..  /* 
117b0 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
117c0 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
117d0 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
117e0 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
117f0 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
11800 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
11810 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
11820 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
11830 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
11840 20 61 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73   are.  ** case-s
11850 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61  ensitive, take a
11860 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74  dvantage of that
11870 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20   by uppercasing 
11880 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20  the mutex name. 
11890 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68   ** and using th
118a0 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64  at as the shared
118b0 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d   filemapping nam
118c0 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72  e..  */.  osChar
118d0 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  UpperW(zName);. 
118e0 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
118f0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
11900 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48  ppingW(INVALID_H
11910 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c  ANDLE_VALUE, NUL
11920 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f             PAGE_
11950 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69  READWRITE, 0, si
11960 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c  zeof(winceLock),
11970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b           zName);
119a0 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
119b0 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
119c0 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
119d0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
119e0 65 6d 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a  emory so it.  **
119f0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
11a00 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
11a10 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
11a20 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
11a30 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
11a40 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
11a50 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
11a60 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
11a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
11a80 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
11a90 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
11aa0 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
11ab0 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
11ac0 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
11ad0 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
11ae0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
11af0 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
11b00 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
11b10 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
11b20 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
11b30 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
11b40 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
11b50 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
11b60 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
11b70 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
11b80 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
11b90 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
11ba0 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
11bb0 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d  .    if( !pFile-
11bc0 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  >shared ){.     
11bd0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11be0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
11bf0 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c  or();.      winL
11c00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11c10 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
11c20 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11c30 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
11c40 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46  CreateLock2", zF
11c50 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
11c60 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a  bLogged = TRUE;.
11c70 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
11c80 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
11c90 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed);.      pFile
11ca0 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c  ->hShared = NULL
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11cc0 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f  * If shared memo
11cd0 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ry could not be 
11ce0 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c  created, then cl
11cf0 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ose the mutex an
11d00 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20  d fail */.  if( 
11d10 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d  pFile->hShared==
11d20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
11d30 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20  !bLogged ){.    
11d40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11d50 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
11d60 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
11d70 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
11d80 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11da0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
11db0 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock3", zFilenam
11dc0 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
11dd0 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  d = TRUE;.    }.
11de0 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
11df0 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
11e00 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  tex);.    osClos
11e10 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
11e20 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
11e30 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
11e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11e50 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
11e60 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
11e70 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
11e80 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f  y if we're suppo
11e90 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20  sed to */.  if( 
11ea0 62 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d  bInit ){.    mem
11eb0 73 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  set(pFile->share
11ec0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  d, 0, sizeof(win
11ed0 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20  ceLock));.  }.. 
11ee0 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11ef0 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11f00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11f10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11f20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74  Destroy the part
11f30 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74   of winFile that
11f40 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63   deals with winc
11f50 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69  e locks.*/.stati
11f60 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74  c void winceDest
11f70 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  royLock(winFile 
11f80 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70  *pFile){.  if (p
11f90 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
11fa0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68     /* Acquire th
11fb0 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
11fc0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
11fd0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11fe0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
11ff0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68  lowing blocks sh
12000 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73  ould probably as
12010 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f  sert in debug mo
12020 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20  de, but they.   
12030 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e      are to clean
12040 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c  up in case any l
12050 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70  ocks remained op
12060 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  en */.    if (pF
12070 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
12080 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ers){.      pFil
12090 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
120a0 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ers --;.    }.  
120b0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
120c0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20  al.bReserved){. 
120d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
120e0 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
120f0 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
12100 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
12110 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
12120 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
12130 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
12140 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
12150 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
12160 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
12170 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
12180 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
12190 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LSE;.    }..    
121a0 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20  /* De-reference 
121b0 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f  and close our co
121c0 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  py of the shared
121d0 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a   memory handle *
121e0 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65  /.    osUnmapVie
121f0 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
12200 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c  hared);.    osCl
12210 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
12220 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
12230 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65  /* Done with the
12240 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
12250 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
12260 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12270 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
12280 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
12290 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
122a0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  tex = NULL;.  }.
122b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c  }../*.** An impl
122c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
122d0 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49  e LockFile() API
122e0 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
122f0 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
12300 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  L winceLockFile(
12310 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
12320 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
12330 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
12340 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12350 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
12360 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
12370 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
12380 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12390 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
123a0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
123b0 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
123c0 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
123d0 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
123e0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
123f0 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
12400 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
12410 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
12420 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
12430 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
12440 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
12450 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
12460 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
12470 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
12480 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
12490 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
124a0 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
124b0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
124c0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
124d0 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
124e0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
124f0 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
12500 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
12510 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
12520 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
12530 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
12540 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
12550 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
12560 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
12570 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
12580 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
12590 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
125a0 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
125b0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
125c0 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
125d0 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
125e0 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
125f0 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
12600 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
12610 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
12620 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
12630 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
12640 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
12650 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
12660 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
12670 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
12680 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
12690 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
126a0 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
126b0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
126c0 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
126d0 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
126e0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
126f0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
12700 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
12710 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
12720 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
12730 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
12740 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
12750 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
12760 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
12770 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
12780 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
12790 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
127a0 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
127b0 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
127c0 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
127d0 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
127e0 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
127f0 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
12800 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
12810 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
12820 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
12830 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
12840 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
12850 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
12860 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
12870 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
12880 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
12890 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
128a0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
128b0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
128c0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
128d0 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
128e0 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
128f0 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
12900 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
12910 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
12920 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
12930 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
12940 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
12950 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
12960 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
12970 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
12980 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
12990 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
129a0 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
129b0 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
129c0 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e  kFile API of Win
129d0 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
129e0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
129f0 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
12a00 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
12a10 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
12a20 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
12a30 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
12a40 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
12a50 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
12a60 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
12a70 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12a80 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
12a90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
12aa0 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
12ab0 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
12ac0 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
12ad0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
12ae0 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
12af0 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
12b00 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
12b10 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
12b20 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
12b30 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
12b40 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
12b50 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
12b60 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12b70 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
12b80 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72  a reader lock or
12b90 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
12ba0 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  ck */.  if (dwFi
12bb0 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
12bc0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
12bd0 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20  ST){.    /* Did 
12be0 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  we have an exclu
12bf0 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
12c00 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
12c10 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
12c20 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
12c30 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12c40 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
12c50 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20  )SHARED_SIZE);. 
12c60 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
12c70 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  l.bExclusive = F
12c80 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
12c90 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
12ca0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
12cb0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
12cc0 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RUE;.    }..    
12cd0 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68  /* Did we just h
12ce0 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ave a reader loc
12cf0 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  k? */.    else i
12d00 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
12d10 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
12d20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
12d30 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
12d40 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
12d50 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  ED_SIZE.        
12d60 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f       || nNumberO
12d70 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
12d80 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70  w == 1);.      p
12d90 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
12da0 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69  ders --;.      i
12db0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
12dc0 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20  nReaders == 0). 
12dd0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
12de0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
12df0 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
12e00 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
12e10 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
12e20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69   }..  /* Releasi
12e30 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  ng a pending loc
12e40 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
12e50 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
12e60 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
12e70 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
12e80 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
12e90 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
12ea0 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
12eb0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
12ec0 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
12ed0 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
12ee0 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
12ef0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
12f00 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
12f10 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
12f20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
12f30 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  }.  /* Releasing
12f40 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
12f50 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
12f60 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
12f70 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45  = (DWORD)RESERVE
12f80 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  D_BYTE.         
12f90 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
12fa0 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
12fb0 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
12fc0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
12fd0 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46  rved) {.      pF
12fe0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
12ff0 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
13000 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
13010 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
13020 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
13030 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
13040 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
13050 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
13060 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
13070 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f  urn bReturn;.}./
13080 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  *.** End of the 
13090 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72  special code for
130a0 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   wince.*********
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
13100 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
13110 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  */../*.** Lock a
13120 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f   file region..*/
13130 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
13140 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
13150 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
13160 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57  WORD flags,.  DW
13170 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20  ORD offsetLow,. 
13180 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67   DWORD offsetHig
13190 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  h,.  DWORD numBy
131a0 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  tesLow,.  DWORD 
131b0 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a  numBytesHigh.){.
131c0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
131d0 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  NCE.  /*.  ** NO
131e0 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
131f0 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
13200 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
13210 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
13220 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  in32.  **       
13230 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20  API LockFile..  
13240 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
13250 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  eLockFile(phFile
13260 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
13270 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
132a0 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
132b0 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  e.  if( osIsNT()
132c0 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
132d0 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d  ED ovlp;.    mem
132e0 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
132f0 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13300 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  );.    ovlp.Offs
13310 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a  et = offsetLow;.
13320 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48      ovlp.OffsetH
13330 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68  igh = offsetHigh
13340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  ;.    return osL
13350 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c  ockFileEx(*phFil
13360 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d  e, flags, 0, num
13370 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
13380 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
13390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
133a0 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a  urn osLockFile(*
133b0 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
133c0 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e  w, offsetHigh, n
133d0 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20  umBytesLow,.    
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
13400 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
13410 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69  *.** Unlock a fi
13420 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73  le region.. */.s
13430 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e  tatic BOOL winUn
13440 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
13450 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
13460 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a  WORD offsetLow,.
13470 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69    DWORD offsetHi
13480 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  gh,.  DWORD numB
13490 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  ytesLow,.  DWORD
134a0 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b   numBytesHigh.){
134b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
134c0 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INCE.  /*.  ** N
134d0 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
134e0 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
134f0 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
13500 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
13510 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20  Win32.  **      
13520 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e   API UnlockFile.
13530 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77  .  */.  return w
13540 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  inceUnlockFile(p
13550 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
13560 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  , offsetHigh,.  
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c         numBytesL
13590 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
135a0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f  );.#else.  if( o
135b0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f  sIsNT() ){.    O
135c0 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
135d0 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70      memset(&ovlp
135e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
135f0 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
13600 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73  lp.Offset = offs
13610 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e  etLow;.    ovlp.
13620 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66  OffsetHigh = off
13630 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74  setHigh;.    ret
13640 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
13650 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e  Ex(*phFile, 0, n
13660 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
13670 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
13680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13690 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
136a0 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
136b0 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
136c0 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
136f0 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
13700 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f.}../**********
13710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13750 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  ***.** The next 
13760 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
13770 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  s implement the 
13780 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63  I/O methods spec
13790 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ified.** by the 
137a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
137b0 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a  ds object..*****
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
13810 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
13820 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
13830 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
13840 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
13850 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
13860 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e  NTER.# define IN
13870 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
13880 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d  OINTER ((DWORD)-
13890 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  1).#endif../*.**
138a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e   Move the curren
138b0 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
138c0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61  e file handle pa
138d0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
138e0 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  t.** argument to
138f0 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20   offset iOffset 
13900 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e  within the file.
13910 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
13920 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68  return 0..** Oth
13930 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c  erwise, set pFil
13940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64  e->lastErrno and
13950 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
13960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13970 77 69 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46  winSeekFile(winF
13980 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
13990 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
139a0 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t){.#if !SQLITE_
139b0 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20  OS_WINRT.  LONG 
139c0 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
139d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
139e0 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
139f0 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
13a00 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
13a10 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
13a20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
13a30 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
13a40 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
13a50 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
13a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13a70 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
13a80 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
13a90 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
13aa0 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
13ab0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
13ac0 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
13ad0 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
13ae0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
13af0 66 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  file=%p, offset=
13b00 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
13b10 68 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20  h, iOffset));.. 
13b20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
13b30 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
13b40 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
13b50 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
13b60 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
13b70 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
13b80 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
13b90 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
13ba0 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
13bb0 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20  eturns a dword. 
13bc0 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
13bd0 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73  he lower 32-bits
13be0 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
13bf0 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20  -offset. Or, if 
13c00 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69  it fails,.  ** i
13c10 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49  t returns INVALI
13c20 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
13c30 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f  ER. However acco
13c40 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20  rding to MSDN,. 
13c50 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f   ** INVALID_SET_
13c60 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79  FILE_POINTER may
13c70 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64   also be a valid
13c80 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20   new offset. So 
13c90 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a  to determine.  *
13ca0 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72  * whether an err
13cb0 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  or has actually 
13cc0 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20  occurred, it is 
13cd0 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74  also necessary t
13ce0 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c  o call.  ** GetL
13cf0 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f  astError()..  */
13d00 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74  .  dwRet = osSet
13d10 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
13d20 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
13d30 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
13d40 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
13d50 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44   (dwRet==INVALID
13d60 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
13d70 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  R.      && ((las
13d80 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13d90 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
13da0 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46  RROR)) ){.    pF
13db0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13dc0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13dd0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13de0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70  TE_IOERR_SEEK, p
13df0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13e10 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20   "winSeekFile", 
13e20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
13e30 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45     OSTRACE(("SEE
13e40 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
13e50 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c  LITE_IOERR_SEEK\
13e60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13e70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13e80 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
13e90 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
13ea0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
13eb0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
13ec0 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  rn 0;.#else.  /*
13ed0 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62  .  ** Same as ab
13ee0 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
13ef0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
13f00 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57  tion works for W
13f10 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41  inRT..  */..  LA
13f20 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20  RGE_INTEGER x;  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f40 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20   The new offset 
13f50 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20  */.  BOOL bRet; 
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13f80 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c  turned by SetFil
13f90 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a  ePointerEx() */.
13fa0 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20  .  x.QuadPart = 
13fb0 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20  iOffset;.  bRet 
13fc0 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  = osSetFilePoint
13fd0 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78  erEx(pFile->h, x
13fe0 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  , 0, FILE_BEGIN)
13ff0 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a  ;..  if(!bRet){.
14000 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14010 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14020 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
14030 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14040 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
14050 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14070 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69  inSeekFile", pFi
14080 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
14090 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
140a0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
140b0 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c  E_IOERR_SEEK\n",
140c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
140d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
140e0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
140f0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14100 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
14110 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
14120 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  0;.#endif.}..#if
14130 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
14140 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61  _SIZE>0./* Forwa
14150 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
14160 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68   VFS helper meth
14170 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ods used for mem
14180 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
14190 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
141a0 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  inMapfile(winFil
141b0 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  e*, sqlite3_int6
141c0 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  4);.static int w
141d0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46  inUnmapfile(winF
141e0 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ile*);.#endif../
141f0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
14200 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72  e..**.** It is r
14210 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20  eported that an 
14220 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65  attempt to close
14230 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20   a handle might 
14240 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69  sometimes.** fai
14250 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65  l.  This is a ve
14260 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ry unreasonable 
14270 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64  result, but Wind
14280 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73  ows is notorious
14290 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e  .** for being un
142a0 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20  reasonable so I 
142b0 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61  do not doubt tha
142c0 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65  t it might happe
142d0 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c  n.  If.** the cl
142e0 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61  ose fails, we pa
142f0 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c  use for 100 mill
14300 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
14310 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d   again.  As.** m
14320 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f  any as MX_CLOSE_
14330 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73  ATTEMPT attempts
14340 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61   to close the ha
14350 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65  ndle are made be
14360 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75  fore.** giving u
14370 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
14380 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65  an error..*/.#de
14390 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  fine MX_CLOSE_AT
143a0 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69  TEMPT 3.static i
143b0 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69  nt winClose(sqli
143c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
143d0 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30   int rc, cnt = 0
143e0 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
143f0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
14400 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  d;..  assert( id
14410 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  !=0 );.#ifndef S
14420 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
14430 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
14440 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  pShm==0 );.#endi
14450 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  f.  assert( pFil
14460 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46  e->h!=NULL && pF
14470 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f  ile->h!=INVALID_
14480 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
14490 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
144a0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
144b0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c  =%p, file=%p\n",
144c0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
144d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
144e0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
144f0 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
14500 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
14510 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69  E>0.  winUnmapfi
14520 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
14530 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  f..  do{.    rc 
14540 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
14550 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
14560 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
14570 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
14580 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
14590 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
145a0 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
145b0 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
145c0 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
145d0 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
145e0 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
145f0 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
14600 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
14610 41 54 54 45 4d 50 54 53 20 33 0a 20 20 7b 0a 20  ATTEMPTS 3.  {. 
14620 20 20 20 77 69 6e 56 66 73 41 70 70 44 61 74 61     winVfsAppData
14630 20 2a 70 41 70 70 44 61 74 61 20 3d 20 28 77 69   *pAppData = (wi
14640 6e 56 66 73 41 70 70 44 61 74 61 2a 29 70 46 69  nVfsAppData*)pFi
14650 6c 65 2d 3e 70 56 66 73 2d 3e 70 41 70 70 44 61  le->pVfs->pAppDa
14660 74 61 3b 0a 20 20 20 20 69 66 28 20 70 41 70 70  ta;.    if( pApp
14670 44 61 74 61 3d 3d 4e 55 4c 4c 20 7c 7c 20 21 70  Data==NULL || !p
14680 41 70 70 44 61 74 61 2d 3e 62 4e 6f 4c 6f 63 6b  AppData->bNoLock
14690 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 63 65 44   ){.      winceD
146a0 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
146b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
146c0 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  f( pFile->zDelet
146d0 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20  eOnClose ){.    
146e0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
146f0 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20   while(.        
14700 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57     osDeleteFileW
14710 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
14720 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20  nClose)==0.     
14730 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41     && osGetFileA
14740 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65  ttributesW(pFile
14750 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14760 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20  )!=0xffffffff.  
14770 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
14780 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
14790 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
147a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
147b0 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
147c0 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
147d0 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
147e0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
147f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14800 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
14810 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
14820 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
14830 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e      pFile->h = N
14840 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43  ULL;.  }.  OpenC
14850 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53  ounter(-1);.  OS
14860 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69  TRACE(("CLOSE pi
14870 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
14880 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
14890 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
148a0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
148b0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
148c0 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f  File->h, rc ? "o
148d0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
148e0 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
148f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
14900 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
14910 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14920 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
14930 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
14960 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
14970 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
14980 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
14990 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
149a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
149b0 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
149c0 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
149d0 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
149e0 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
149f0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
14a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14a10 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
14a20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
14a30 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
14a40 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
14a50 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
14a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
14a70 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
14a80 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
14a90 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14ab0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
14ac0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
14ad0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
14ae0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
14af0 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
14b00 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  offset */.){.#if
14b10 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
14b20 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
14b30 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
14b40 45 52 4c 41 50 50 45 44 29 0a 20 20 4f 56 45 52  ERLAPPED).  OVER
14b50 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65  LAPPED overlappe
14b60 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
14b70 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65  he offset for Re
14b80 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69  adFile. */.#endi
14b90 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  f.  winFile *pFi
14ba0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
14bb0 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64  d;  /* file hand
14bc0 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52  le */.  DWORD nR
14bd0 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
14be0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14bf0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
14c00 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69  lly read from fi
14c10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
14c20 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
14c30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14c40 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a  r of retrys */..
14c50 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
14c60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
14c70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
14c80 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53  offset>=0 );.  S
14c90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
14ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14cb0 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52  RR_READ);.  OSTR
14cc0 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
14cd0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
14ce0 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70  le=%p, buffer=%p
14cf0 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20  , amount=%d, ". 
14d00 20 20 20 20 20 20 20 20 20 20 22 6f 66 66 73 65            "offse
14d10 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c  t=%lld, lock=%d\
14d20 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
14d30 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14d40 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  le,.           p
14d50 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
14d60 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c  mt, offset, pFil
14d70 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
14d80 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
14d90 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
14da0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
14db0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
14dc0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
14dd0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
14de0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
14df0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
14e00 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
14e10 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
14e20 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
14e30 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
14e40 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
14e50 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
14e60 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
14e70 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
14e80 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
14e90 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
14ea0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
14eb0 52 45 41 44 2d 4d 4d 41 50 20 70 69 64 3d 25 6c  READ-MMAP pid=%l
14ec0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
14ed0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14ee0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
14ef0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
14f00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14f10 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
14f20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
14f30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
14f40 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
14f50 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69  Copy = (int)(pFi
14f60 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
14f70 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65  ffset);.      me
14f80 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
14f90 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
14fa0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
14fb0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
14fc0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
14fd0 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
14fe0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
14ff0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
15000 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
15010 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
15020 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
15030 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
15040 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
15050 45 44 29 0a 20 20 69 66 28 20 77 69 6e 53 65 65  ED).  if( winSee
15060 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
15070 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52  set) ){.    OSTR
15080 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
15090 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
150a0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
150b0 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20  _FULL\n",.      
150c0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
150d0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
150e0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
150f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15100 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
15110 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
15120 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
15130 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
15140 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d   0) ){.#else.  m
15150 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
15160 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
15170 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65  RLAPPED));.  ove
15180 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
15190 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
151a0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
151b0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
151c0 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
151d0 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
151e0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69  7fffffff);.  whi
151f0 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
15200 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
15210 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76  amt, &nRead, &ov
15220 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20  erlapped) &&.   
15230 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
15240 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41  rror()!=ERROR_HA
15250 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64  NDLE_EOF ){.#end
15260 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  if.    DWORD las
15270 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20  tErrno;.    if( 
15280 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
15290 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
152a0 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
152b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
152c0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
152d0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
152e0 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
152f0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
15300 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
15310 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20  READ\n",.       
15320 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
15330 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15340 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
15350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
15360 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
15370 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
15380 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
153b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
153c0 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72   }.  winLogIoerr
153d0 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f  (nRetry, __LINE_
153e0 5f 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  _);.  if( nRead<
153f0 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
15400 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
15410 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
15420 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
15430 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
15440 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
15450 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
15460 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52  nRead);.    OSTR
15470 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
15480 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15490 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
154a0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
154b0 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  D\n",.          
154c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
154d0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
154e0 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
154f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15500 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
15510 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  D;.  }..  OSTRAC
15520 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
15530 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
15540 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
15550 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
15560 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
15570 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15580 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
15590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
155a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
155b0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
155c0 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
155d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
155e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
155f0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
15600 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
15610 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
15620 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
15630 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15650 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
15660 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
15670 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
15680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15690 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69   bytes to be wri
156a0 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  tten */.  int am
156b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
156c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
156d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
156e0 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
156f0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
15700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15710 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
15720 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  le to begin writ
15730 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69  ing at */.){.  i
15740 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15760 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20  * True if error 
15770 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c  has occurred, el
15780 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
15790 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
157a0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
157b0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
157c0 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
157d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
157e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
157f0 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
15800 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
15810 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
15820 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15830 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
15840 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
15850 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
15860 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
15870 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
15880 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70  STRACE(("WRITE p
15890 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
158a0 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  , file=%p, buffe
158b0 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
158c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f   ".           "o
158d0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b  ffset=%lld, lock
158e0 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  =%d\n", osGetCur
158f0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15900 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
15910 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75     pFile->h, pBu
15920 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20  f, amt, offset, 
15930 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
15940 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
15950 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
15960 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54 45  WRITE) && SQLITE
15970 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15980 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
15990 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
159a0 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
159b0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
159c0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
159d0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
159e0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
159f0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
15a00 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
15a10 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
15a20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
15a30 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
15a40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
15a50 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
15a60 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
15a70 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
15a80 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
15a90 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41  RACE(("WRITE-MMA
15aa0 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
15ab0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
15ac0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
15ae0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15af0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15b00 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
15b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15b30 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28     int nCopy = (
15b40 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70  int)(pFile->mmap
15b50 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a  Size - offset);.
15b60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
15b70 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
15b80 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
15b90 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
15ba0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
15bb0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
15bc0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
15bd0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
15be0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
15bf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
15c00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
15c10 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  INCE || defined(
15c20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
15c30 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 72 63  OVERLAPPED).  rc
15c40 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70   = winSeekFile(p
15c50 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
15c60 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65   if( rc==0 ){.#e
15c70 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23  lse.  {.#endif.#
15c80 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
15c90 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28  NCE && !defined(
15ca0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
15cb0 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20  OVERLAPPED).    
15cc0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
15cd0 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  apped;        /*
15ce0 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
15cf0 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65  WriteFile. */.#e
15d00 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65  ndif.    u8 *aRe
15d10 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
15d20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
15d30 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
15d40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
15d50 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
15d60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15d70 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
15d80 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
15d90 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
15dc0 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
15dd0 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
15de0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
15df0 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
15e00 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
15e10 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
15e20 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  () */..#if !SQLI
15e30 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
15e40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
15e50 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
15e60 45 44 29 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ED).    memset(&
15e70 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
15e80 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
15e90 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  ));.    overlapp
15ea0 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
15eb0 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
15ec0 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65  ffffff);.    ove
15ed0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
15ee0 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
15ef0 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
15f00 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a  fffff);.#endif..
15f10 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
15f20 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  0 ){.#if SQLITE_
15f30 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69  OS_WINCE || defi
15f40 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
15f50 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a  _NO_OVERLAPPED).
15f60 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
15f70 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
15f80 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
15f90 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73  rite, 0) ){.#els
15fa0 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  e.      if( !osW
15fb0 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
15fc0 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
15fd0 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70  nWrite, &overlap
15fe0 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20  ped) ){.#endif. 
15ff0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65         if( winRe
16000 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
16010 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
16020 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
16050 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69  Write==0 || nWri
16060 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20  te<=(DWORD)nRem 
16070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72  );.      if( nWr
16080 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
16090 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a  >(DWORD)nRem ){.
160a0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
160b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
160c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or();.        br
160d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
160e0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
160f0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
16100 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
16110 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20  ERLAPPED).      
16120 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65  offset += nWrite
16130 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
16140 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
16150 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
16160 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f  ffffff);.      o
16170 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
16180 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
16190 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
161a0 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
161b0 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
161c0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
161d0 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
161e0 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
161f0 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
16200 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
16210 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
16220 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
16230 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
16240 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
16250 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
16260 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
16270 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
16280 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16290 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
162a0 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54  LL )){.      OST
162b0 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
162c0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
162d0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
162e0 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20  TE_FULL\n",.    
162f0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16300 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16310 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16320 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
16330 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
16340 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69  SQLITE_FULL, pFi
16350 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
16380 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
16390 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53  h);.    }.    OS
163a0 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69  TRACE(("WRITE pi
163b0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
163c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
163d0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c  ITE_IOERR_WRITE\
163e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
163f0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16400 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16410 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16420 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16430 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16440 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  _WRITE, pFile->l
16450 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 22 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46   "winWrite2", pF
16480 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
16490 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67  else{.    winLog
164a0 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f  Ioerr(nRetry, __
164b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 4f  LINE__);.  }.  O
164c0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70  STRACE(("WRITE p
164d0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
164e0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
164f0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
16500 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16510 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16520 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
16530 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16540 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16550 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
16560 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
16570 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
16580 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63  tic int winTrunc
16590 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
165a0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
165b0 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69  t64 nByte){.  wi
165c0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
165d0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
165e0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a   File handle obj
165f0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
16600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
16610 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16620 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  rn code for this
16630 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
16640 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
16650 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16660 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
16670 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 4d 6d  ite3_int64 oldMm
16680 61 70 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 46  apSize;.  if( pF
16690 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30  ile->nFetchOut>0
166a0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6c 65 20   ){.    /* File 
166b0 74 72 75 6e 63 61 74 69 6f 6e 20 69 73 20 61 20  truncation is a 
166c0 6e 6f 2d 6f 70 20 69 66 20 74 68 65 72 65 20 61  no-op if there a
166d0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d  re outstanding m
166e0 65 6d 6f 72 79 20 6d 61 70 70 65 64 0a 20 20 20  emory mapped.   
166f0 20 2a 2a 20 70 61 67 65 73 2e 20 20 54 68 69 73   ** pages.  This
16700 20 69 73 20 62 65 63 61 75 73 65 20 74 72 75 6e   is because trun
16710 63 61 74 69 6e 67 20 74 68 65 20 66 69 6c 65 20  cating the file 
16720 6d 65 61 6e 73 20 74 65 6d 70 6f 72 61 72 69 6c  means temporaril
16730 79 20 75 6e 6d 61 70 70 69 6e 67 0a 20 20 20 20  y unmapping.    
16740 2a 2a 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  ** the file, and
16750 20 74 68 61 74 20 6d 69 67 68 74 20 64 65 6c 65   that might dele
16760 74 65 20 6d 65 6d 6f 72 79 20 6f 75 74 20 66 72  te memory out fr
16770 6f 6d 20 75 6e 64 65 72 20 65 78 69 73 74 69 6e  om under existin
16780 67 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a  g cursors..    *
16790 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61  *.    ** This ca
167a0 6e 20 72 65 73 75 6c 74 20 69 6e 20 69 6e 63 72  n result in incr
167b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 6e  emental vacuum n
167c0 6f 74 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ot truncating th
167d0 65 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20 69  e file,.    ** i
167e0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63  f there is an ac
167f0 74 69 76 65 20 72 65 61 64 20 63 75 72 73 6f 72  tive read cursor
16800 20 77 68 65 6e 20 74 68 65 20 69 6e 63 72 65 6d   when the increm
16810 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 6f 63 63  ental vacuum occ
16820 75 72 73 2e 0a 20 20 20 20 2a 2a 20 4e 6f 20 72  urs..    ** No r
16830 65 61 6c 20 68 61 72 6d 20 63 6f 6d 65 73 20 6f  eal harm comes o
16840 66 20 74 68 69 73 20 2d 20 74 68 65 20 64 61 74  f this - the dat
16850 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
16860 74 20 63 6f 72 72 75 70 74 65 64 2c 0a 20 20 20  t corrupted,.   
16870 20 2a 2a 20 74 68 6f 75 67 68 20 73 6f 6d 65 20   ** though some 
16880 66 6f 6c 6b 73 20 6d 69 67 68 74 20 63 6f 6d 70  folks might comp
16890 6c 61 69 6e 20 74 68 61 74 20 74 68 65 20 66 69  lain that the fi
168a0 6c 65 20 69 73 20 62 69 67 67 65 72 20 74 68 61  le is bigger tha
168b0 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6e 65 65 64  n it.    ** need
168c0 73 20 74 6f 20 62 65 2e 0a 20 20 20 20 2a 2a 0a  s to be..    **.
168d0 20 20 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20      ** The only 
168e0 66 65 61 73 69 62 6c 65 20 77 6f 72 6b 2d 61 72  feasible work-ar
168f0 6f 75 6e 64 20 69 73 20 74 6f 20 64 65 66 65 72  ound is to defer
16900 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
16910 75 6e 74 69 6c 20 61 66 74 65 72 0a 20 20 20 20  until after.    
16920 2a 2a 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ** all reference
16930 73 20 74 6f 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  s to memory-mapp
16940 65 64 20 63 6f 6e 74 65 6e 74 20 61 72 65 20 63  ed content are c
16950 6c 6f 73 65 64 2e 20 20 54 68 61 74 20 69 73 20  losed.  That is 
16960 64 6f 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 62  doable,.    ** b
16970 75 74 20 69 6e 76 6f 6c 76 65 73 20 61 64 64 69  ut involves addi
16980 6e 67 20 61 20 66 65 77 20 62 72 61 6e 63 68 65  ng a few branche
16990 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s in the common 
169a0 77 72 69 74 65 20 63 6f 64 65 20 70 61 74 68 20  write code path 
169b0 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 6f 75  which.    ** cou
169c0 6c 64 20 73 6c 6f 77 20 64 6f 77 6e 20 6e 6f 72  ld slow down nor
169d0 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  mal operations s
169e0 6c 69 67 68 74 6c 79 2e 20 20 48 65 6e 63 65 2c  lightly.  Hence,
169f0 20 77 65 20 68 61 76 65 20 64 65 63 69 64 65 64   we have decided
16a00 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6e 6f 77 20   for.    ** now 
16a10 74 6f 20 73 69 6d 70 6c 79 20 6d 61 6b 65 20 74  to simply make t
16a20 72 61 6e 63 61 74 69 6f 6e 73 20 61 20 6e 6f 2d  rancations a no-
16a30 6f 70 20 69 66 20 74 68 65 72 65 20 61 72 65 20  op if there are 
16a40 70 65 6e 64 69 6e 67 20 72 65 61 64 73 2e 20 20  pending reads.  
16a50 57 65 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 61  We.    ** can ma
16a60 79 62 65 20 72 65 76 69 73 69 74 20 74 68 69 73  ybe revisit this
16a70 20 64 65 63 69 73 69 6f 6e 20 69 6e 20 74 68 65   decision in the
16a80 20 66 75 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a   future..    */.
16a90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16aa0 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  E_OK;.  }.#endif
16ab0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
16ac0 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
16ad0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
16ae0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
16af0 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ATE);.  OSTRACE(
16b00 28 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25  ("TRUNCATE pid=%
16b10 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
16b20 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
16b30 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
16b40 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
16b50 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
16b60 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
16b70 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d  h, nByte, pFile-
16b80 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20  >locktype));..  
16b90 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
16ba0 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
16bb0 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
16bc0 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
16bd0 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
16be0 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
16bf0 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
16c00 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
16c10 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
16c20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
16c30 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
16c40 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
16c50 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
16c60 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
16c70 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
16c80 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
16c90 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
16ca0 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
16cb0 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
16cc0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
16cd0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
16ce0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
16cf0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
16d00 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61    if( pFile->pMa
16d10 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f  pRegion ){.    o
16d20 6c 64 4d 6d 61 70 53 69 7a 65 20 3d 20 70 46 69  ldMmapSize = pFi
16d30 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 20 20  le->mmapSize;.  
16d40 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 6c 64 4d 6d  }else{.    oldMm
16d50 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a  apSize = 0;.  }.
16d60 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
16d70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  File);.#endif.. 
16d80 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65   /* SetEndOfFile
16d90 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  () returns non-z
16da0 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73  ero when success
16db0 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65  ful, or zero whe
16dc0 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  n it fails. */. 
16dd0 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
16de0 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29  (pFile, nByte) )
16df0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
16e00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
16e10 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
16e20 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
16e50 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
16e60 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
16e70 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
16e80 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20  e(pFile->h) &&. 
16e90 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73             ((las
16ea0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16eb0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
16ec0 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49  R_USER_MAPPED_FI
16ed0 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LE) ){.    pFile
16ee0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
16ef0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
16f00 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
16f10 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
16f20 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
16f30 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
16f40 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
16f50 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c  Truncate2", pFil
16f60 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
16f70 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16f80 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
16f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16fa0 26 20 6f 6c 64 4d 6d 61 70 53 69 7a 65 3e 30 20  & oldMmapSize>0 
16fb0 29 7b 0a 20 20 20 20 69 66 28 20 6f 6c 64 4d 6d  ){.    if( oldMm
16fc0 61 70 53 69 7a 65 3e 6e 42 79 74 65 20 29 7b 0a  apSize>nByte ){.
16fd0 20 20 20 20 20 20 77 69 6e 4d 61 70 66 69 6c 65        winMapfile
16fe0 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
16ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69   }else{.      wi
17000 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  nMapfile(pFile, 
17010 6f 6c 64 4d 6d 61 70 53 69 7a 65 29 3b 0a 20 20  oldMmapSize);.  
17020 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
17030 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
17040 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  CATE pid=%lu, pF
17050 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
17060 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
17070 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
17080 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
17090 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
170a0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
170b0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
170c0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
170d0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
170e0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
170f0 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
17100 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
17110 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
17120 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
17130 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
17140 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
17150 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
17160 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17170 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
17180 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
17190 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
171a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
171b0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
171c0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
171d0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
171e0 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
171f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17200 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  nSync(sqlite3_fi
17210 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
17220 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s){.#ifndef SQLI
17230 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a  TE_NO_SYNC.  /*.
17240 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77    ** Used only w
17250 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
17260 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
17270 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20  d..   */.  BOOL 
17280 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  rc;.#endif.#if !
17290 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
172a0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
172b0 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c  TE_NO_SYNC) || \
172c0 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c  .    defined(SQL
172d0 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
172e0 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  E).  /*.  ** Use
172f0 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  d when SQLITE_NO
17300 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
17310 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20  ined and by the 
17320 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a  assert() and/or.
17330 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d    ** OSTRACE() m
17340 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77  acros..   */.  w
17350 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
17360 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65  (winFile*)id;.#e
17370 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
17380 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64  AMETER(id);.#end
17390 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
173a0 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63  ile );.  /* Chec
173b0 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
173c0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
173d0 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
173e0 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
173f0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
17400 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
17410 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
17420 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
17430 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
17440 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
17450 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
17460 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
17470 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
17480 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
17490 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
174a0 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
174b0 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
174c0 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
174d0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
174e0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
174f0 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
17500 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70  OSTRACE(("SYNC p
17510 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
17520 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73  , file=%p, flags
17530 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%x, lock=%d\n",
17540 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
17550 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
17560 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
17570 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20 20 20  e->h, flags,.   
17580 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
17590 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e  ocktype));..#ifn
175a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
175b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
175c0 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
175d0 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
175e0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
175f0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
17600 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
17610 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
17620 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
17630 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
17640 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
17650 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
17660 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
17670 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
17680 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
17690 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
176a0 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28  SYNC.  OSTRACE((
176b0 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d 25 6c  "SYNC-NOP pid=%l
176c0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
176d0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
176e0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
176f0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
17700 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
17710 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17730 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53 51 4c 49  ;.#else.#if SQLI
17740 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
17750 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
17760 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
17770 20 20 69 66 28 20 6f 73 46 6c 75 73 68 56 69 65    if( osFlushVie
17780 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70  wOfFile(pFile->p
17790 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29 20 29 7b  MapRegion, 0) ){
177a0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
177b0 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25  "SYNC-MMAP pid=%
177c0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
177d0 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
177e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
177f0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
17800 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
17810 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20  essId(),.       
17820 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70          pFile, p
17830 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
17840 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
17850 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
17860 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
17870 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
17880 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d  OSTRACE(("SYNC-M
17890 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
178a0 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
178b0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
178c0 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
178d0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
178e0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
178f0 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20  cessId(),.      
17900 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20           pFile, 
17910 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
17920 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n));.      retur
17930 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
17940 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
17950 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17960 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
17970 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
17980 53 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  Sync1", pFile->z
17990 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
179a0 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 6f  .#endif.  rc = o
179b0 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
179c0 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53  s(pFile->h);.  S
179d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
179e0 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66  rc=FALSE );.  if
179f0 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52  ( rc ){.    OSTR
17a00 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25  ACE(("SYNC pid=%
17a10 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
17a20 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
17a30 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
17a40 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
17a50 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
17a60 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
17a70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17a80 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
17a90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
17aa0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
17ab0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54  Error();.    OST
17ac0 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d  RACE(("SYNC pid=
17ad0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
17ae0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
17af0 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22  E_IOERR_FSYNC\n"
17b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
17b10 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
17b20 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
17b30 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
17b40 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
17b50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
17b60 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SYNC, pFile->las
17b70 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17b90 77 69 6e 53 79 6e 63 32 22 2c 20 70 46 69 6c 65  winSync2", pFile
17ba0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
17bb0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
17bc0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
17bd0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
17be0 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
17bf0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
17c00 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
17c10 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
17c20 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
17c30 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
17c40 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
17c50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17c60 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
17c70 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
17c80 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a  rt( pSize!=0 );.
17c90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17ca0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
17cb0 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20  IOERR_FSTAT);.  
17cc0 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
17cd0 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
17ce0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
17cf0 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  Size));..#if SQL
17d00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
17d10 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41  .    FILE_STANDA
17d20 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20  RD_INFO info;.  
17d30 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49    if( osGetFileI
17d40 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
17d50 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46  leEx(pFile->h, F
17d60 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c  ileStandardInfo,
17d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a        &info, siz
17da0 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20  eof(info)) ){.  
17db0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66      *pSize = inf
17dc0 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64  o.EndOfFile.Quad
17dd0 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Part;.    }else{
17de0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
17df0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
17e00 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
17e10 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
17e20 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
17e30 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
17e40 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
17e70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
17e80 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
17e90 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65  {.    DWORD uppe
17ea0 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
17eb0 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
17ec0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
17ed0 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20  ..    lowerBits 
17ee0 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28  = osGetFileSize(
17ef0 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
17f00 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a  Bits);.    *pSiz
17f10 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
17f20 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
17f30 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
17f40 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77  ;.    if(   (low
17f50 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
17f60 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
17f70 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
17f80 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
17f90 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
17fa0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
17fb0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
17fc0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
17fd0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
17fe0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
17ff0 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
18000 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
18020 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
18030 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
18040 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
18050 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
18060 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20  e=%p, pSize=%p, 
18070 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d  *pSize=%lld, rc=
18080 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
18090 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a    pFile->h, pSiz
180a0 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74  e, *pSize, sqlit
180b0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
180c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
180d0 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
180e0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
180f0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
18100 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
18110 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
18120 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
18130 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
18140 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
18150 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
18160 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
18170 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
18180 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IVE_LOCK.# defin
18190 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  e LOCKFILE_EXCLU
181a0 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64  SIVE_LOCK 2.#end
181b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72  if../*.** Histor
181c0 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68  ically, SQLite h
181d0 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65  as used both the
181e0 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f   LockFile and Lo
181f0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
18200 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ns..** When the 
18210 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f  LockFile functio
18220 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77  n was used, it w
18230 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  as always expect
18240 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d  ed to fail.** im
18250 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
18260 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
18270 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c  be obtained.  Al
18280 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78  so, it always ex
18290 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74  pected to.** obt
182a0 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
182b0 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c   lock.  These fl
182c0 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ags are used wit
182d0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  h the LockFileEx
182e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64   function.** and
182f0 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65   reflect those e
18300 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65  xpectations; the
18310 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f  refore, they sho
18320 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  uld not be chang
18330 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
18340 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
18350 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
18360 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
18370 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f  AGS   (LOCKFILE_
18380 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
18390 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   | \.           
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183b0 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f         LOCKFILE_
183c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
183d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75  #endif../*.** Cu
183e0 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20  rrently, SQLite 
183f0 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20  never calls the 
18400 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
18410 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74  ion without want
18420 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20  ing the.** call 
18430 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74  to fail immediat
18440 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
18450 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
18460 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
18470 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
18480 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
18490 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
184a0 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c  X_FLAGS (LOCKFIL
184b0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
184c0 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  LY).#endif../*.*
184d0 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64  * Acquire a read
184e0 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66  er lock..** Diff
184f0 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e  erent API routin
18500 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65  es are called de
18510 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
18520 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a  er or not this.*
18530 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69  * is Win9x or Wi
18540 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nNT..*/.static i
18550 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  nt winGetReadLoc
18560 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
18570 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
18580 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
18590 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
185a0 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
185b0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
185c0 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73  pe));.  if( osIs
185d0 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
185e0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
185f0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
18600 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
18610 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
18620 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
18630 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
18640 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50  .    **       AP
18650 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20  I LockFileEx..  
18660 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77    */.    res = w
18670 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46  inceLockFile(&pF
18680 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
18690 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  IRST, 0, 1, 0);.
186a0 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20  #else.    res = 
186b0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
186c0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
186d0 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20  CKFILEEX_FLAGS, 
186e0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
186f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18700 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
18710 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  ZE, 0);.#endif. 
18720 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
18730 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
18740 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
18750 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lk;.    sqlite3_
18760 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
18770 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
18780 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
18790 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29  ckByte = (short)
187a0 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66  ((lk & 0x7ffffff
187b0 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
187c0 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  - 1));.    res =
187d0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
187e0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
187f0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
18820 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
18830 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
18840 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
18850 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
18860 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
18870 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18880 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
18890 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
188a0 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
188b0 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43   */.  }.  OSTRAC
188c0 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69  E(("READ-LOCK fi
188d0 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
188e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
188f0 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  es));.  return r
18900 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  es;.}../*.** Und
18910 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a  o a readlock.*/.
18920 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
18930 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e  lockReadLock(win
18940 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
18950 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44  int res;.  DWORD
18960 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53   lastErrno;.  OS
18970 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c  TRACE(("READ-UNL
18980 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
18990 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
189a0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
189b0 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73  pe));.  if( osIs
189c0 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
189d0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
189e0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
189f0 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
18a00 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d  ED_SIZE, 0);.  }
18a10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
18a20 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
18a30 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
18a40 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
18a50 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
18a60 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
18a70 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
18a80 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
18a90 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26  f.  if( res==0 &
18aa0 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
18ab0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
18ac0 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43  )!=ERROR_NOT_LOC
18ad0 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  KED) ){.    pFil
18ae0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
18af0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
18b00 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
18b10 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70  _IOERR_UNLOCK, p
18b20 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
18b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b40 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c   "winUnlockReadL
18b50 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ock", pFile->zPa
18b60 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  th);.  }.  OSTRA
18b70 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b  CE(("READ-UNLOCK
18b80 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74   file=%p, result
18b90 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
18ba0 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72  , res));.  retur
18bb0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
18bc0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
18bd0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
18be0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
18bf0 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
18c00 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
18c10 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
18c20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
18c30 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
18c40 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
18c50 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
18c60 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
18c70 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
18c80 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
18c90 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
18ca0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
18cb0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
18cc0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
18cd0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
18ce0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
18cf0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
18d00 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
18d10 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
18d20 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
18d30 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
18d40 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
18d50 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
18d60 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
18d70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
18d80 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
18d90 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
18da0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
18db0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
18dc0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
18dd0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
18de0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
18df0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
18e00 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
18e10 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
18e20 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
18e30 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
18e40 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
18e50 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
18e60 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
18e70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
18e80 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
18e90 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77  e a lock.  The w
18ea0 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  inUnlock() routi
18eb0 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c  ne.** erases all
18ec0 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61   locks at once a
18ed0 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d  nd returns us im
18ee0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63  mediately to loc
18ef0 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a  king level 0..**
18f00 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
18f10 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65  ble to lower the
18f20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
18f30 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d  ne step at a tim
18f40 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20  e.  You.** must 
18f50 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c  go straight to l
18f60 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
18f70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18f80 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nLock(sqlite3_fi
18f90 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
18fa0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
18fb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18fc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
18fd0 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
18fe0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
18ff0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
19000 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f  esult of a Windo
19010 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
19020 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
19030 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
19040 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
19050 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
19060 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
19070 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
19080 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
19090 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
190a0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
190b0 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69  his time */.  wi
190c0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
190d0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
190e0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
190f0 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
19100 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
19110 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
19120 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
19130 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
19140 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
19150 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
19160 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
19170 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
19180 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
19190 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
191a0 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
191b0 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
191c0 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
191d0 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
191e0 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
191f0 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
19200 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
19210 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
19220 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
19230 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
19240 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
19250 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
19260 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
19270 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
19280 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65  ("LOCK-HELD file
19290 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
192a0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
192b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
192c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
192d0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
192e0 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72 69 74 65  ny kind of write
192f0 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61 64 2d  -lock on a read-
19300 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a 20 20  only database.  
19310 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
19320 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
19330 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d 30 20  FILE_RDONLY)!=0 
19340 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  && locktype>=RES
19350 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
19360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19370 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  IOERR_LOCK;.  }.
19380 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
19390 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
193a0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
193b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
193c0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
193d0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
193e0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
193f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
19400 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
19410 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
19420 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
19430 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
19440 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
19450 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
19460 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
19470 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
19480 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
19490 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
194a0 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
194b0 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
194c0 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
194d0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
194e0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
194f0 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
19500 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
19510 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
19520 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
19530 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
19540 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
19550 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20  ktype==NO_LOCK. 
19560 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
19570 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
19580 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
19590 65 3c 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e<=RESERVED_LOCK
195a0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
195b0 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
195c0 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
195d0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
195e0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
195f0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
19600 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19620 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44              PEND
19630 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
19640 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
19650 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74  /* Try 3 times t
19660 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e  o get the pendin
19670 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73  g lock.  This is
19680 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a   needed to work.
19690 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20        ** around 
196a0 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
196b0 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f  by indexing and/
196c0 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f  or anti-virus so
196d0 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20  ftware on.      
196e0 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  ** Windows syste
196f0 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ms..      ** If 
19700 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68  you are using th
19710 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64  is code as a mod
19720 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69  el for alternati
19730 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74  ve VFSes, do not
19740 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74  .      ** copy t
19750 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e  his retry logic.
19760 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69    It is a hack i
19770 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64  ntended for Wind
19780 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ows only..      
19790 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  */.      lastErr
197a0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
197b0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
197c0 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44  RACE(("LOCK-PEND
197d0 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70  ING-FAIL file=%p
197e0 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75  , count=%d, resu
197f0 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  lt=%d\n",.      
19800 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19810 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20  h, cnt, res));. 
19820 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
19830 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49  no==ERROR_INVALI
19840 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20  D_HANDLE ){.    
19850 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19860 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
19870 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
19880 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
19890 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
198a0 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69  E(("LOCK-FAIL fi
198b0 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c  le=%p, count=%d,
198c0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
198d0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
198e0 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74  e->h, cnt, sqlit
198f0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
19900 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19910 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19920 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69    if( cnt ) sqli
19930 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
19940 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
19950 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72  tPendingLock = r
19960 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73  es;.    if( !res
19970 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72   ){.      lastEr
19980 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
19990 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
199a0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
199b0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20  a shared lock.  
199c0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
199d0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
199e0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
199f0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
19a00 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  type==NO_LOCK );
19a10 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65  .    res = winGe
19a20 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
19a30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
19a40 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
19a50 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
19a60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19a70 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
19a80 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
19a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19aa0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
19ab0 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
19ac0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
19ad0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
19ae0 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
19af0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
19b00 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
19b10 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
19b20 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
19b30 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
19b40 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
19b50 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
19b60 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
19b70 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
19b80 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c  ype = RESERVED_L
19b90 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
19ba0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
19bb0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
19bc0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
19bd0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
19be0 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
19bf0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
19c00 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
19c10 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
19c20 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
19c30 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
19c40 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
19c50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
19c60 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
19c70 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
19c80 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
19c90 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
19ca0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19cb0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
19cc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
19cd0 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
19ce0 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
19cf0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
19d00 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
19d10 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
19d20 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  ILE_FLAGS, SHARE
19d30 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
19d60 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
19d70 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
19d80 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ype = EXCLUSIVE_
19d90 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
19da0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
19db0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
19dc0 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65  r();.      winGe
19dd0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
19de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19df0 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64  * If we are hold
19e00 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ing a PENDING lo
19e10 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f  ck that ought to
19e20 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68   be released, th
19e30 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  en.  ** release 
19e40 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
19e50 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  f( gotPendingLoc
19e60 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  k && locktype==S
19e70 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
19e80 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
19e90 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
19ea0 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
19eb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
19ec0 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ate the state of
19ed0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65   the lock has he
19ee0 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  ld in the file d
19ef0 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20  escriptor then. 
19f00 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61   ** return the a
19f10 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c  ppropriate resul
19f20 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  t code..  */.  i
19f30 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63  f( res ){.    rc
19f40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19f50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
19f60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
19f70 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
19f80 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
19f90 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
19fa0 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  K-FAIL file=%p, 
19fb0 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25  wanted=%d, got=%
19fc0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19fd0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63     pFile->h, loc
19fe0 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
19ff0 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  pe));.  }.  pFil
1a000 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
1a010 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
1a020 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
1a030 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
1a040 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1a050 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
1a060 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
1a070 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1a080 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1a090 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1a0a0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
1a0b0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
1a0c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
1a0d0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
1a0e0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
1a0f0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
1a100 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
1a110 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
1a120 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  , return.** non-
1a130 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1a140 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
1a150 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65  int winCheckRese
1a160 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
1a170 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
1a180 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
1a190 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  res;.  winFile *
1a1a0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
1a1b0 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
1a1c0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1a1d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
1a1e0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
1a1f0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1a200 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
1a210 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
1a220 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
1a230 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73  ResOut));..  ass
1a240 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
1a250 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
1a260 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
1a270 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  CK ){.    res = 
1a280 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  1;.    OSTRACE((
1a290 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
1a2a0 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
1a2b0 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
1a2c0 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
1a2d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d  }else{.    res =
1a2e0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
1a2f0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
1a300 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
1a310 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 30 2c  RESERVED_BYTE,0,
1a320 31 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  1,0);.    if( re
1a330 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e  s ){.      winUn
1a340 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
1a350 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
1a360 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
1a370 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65   }.    res = !re
1a380 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  s;.    OSTRACE((
1a390 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
1a3a0 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
1a3b0 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46   (remote)\n", pF
1a3c0 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
1a3d0 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
1a3e0 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  res;.  OSTRACE((
1a3f0 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
1a400 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25  le=%p, pResOut=%
1a410 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20  p, *pResOut=%d, 
1a420 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1a430 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1a440 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a  e->h, pResOut, *
1a450 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
1a460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a470 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
1a480 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
1a490 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
1a4a0 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
1a4b0 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
1a4c0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
1a4d0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
1a4e0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
1a4f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1a500 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
1a510 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
1a520 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
1a530 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1a540 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
1a550 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1a560 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1a570 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1a580 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
1a590 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
1a5a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a5b0 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
1a5c0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
1a5d0 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
1a5e0 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
1a5f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
1a600 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
1a610 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
1a620 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
1a630 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a640 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
1a650 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
1a660 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
1a670 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
1a680 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a690 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
1a6a0 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
1a6b0 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
1a6c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
1a6d0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
1a6e0 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
1a6f0 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
1a700 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1a710 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
1a720 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
1a730 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
1a740 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
1a750 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
1a760 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
1a770 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
1a780 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
1a790 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
1a7a0 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
1a7b0 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
1a7c0 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
1a7d0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
1a7e0 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74  _LOCK && !winGet
1a7f0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20  ReadLock(pFile) 
1a800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1a810 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
1a820 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64  ppen.  We should
1a830 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20   always be able 
1a840 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63  to.      ** reac
1a850 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
1a860 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ock */.      rc 
1a870 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1a880 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
1a890 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  K, osGetLastErro
1a8a0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1a8c0 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  Unlock", pFile->
1a8d0 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
1a8e0 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45  }.  if( type>=RE
1a8f0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
1a900 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
1a910 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
1a920 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
1a930 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
1a940 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
1a950 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
1a960 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
1a970 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
1a980 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
1a990 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c   type>=PENDING_L
1a9a0 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
1a9b0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
1a9c0 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
1a9d0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
1a9e0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
1a9f0 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
1aa00 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
1aa10 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
1aa20 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
1aa30 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1aa40 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
1aa50 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
1aa60 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
1aa70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
1aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
1aaf0 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
1ab00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
1ab20 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
1ab30 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
1ab40 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
1ab50 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
1ab60 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
1ab70 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
1ab80 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
1ab90 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
1aba0 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
1abb0 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
1abc0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1abd0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
1abe0 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
1abf0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
1ac00 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
1ac10 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
1ac20 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
1ac30 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
1ac40 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
1ac50 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
1ac60 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
1ac70 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
1ac80 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
1ac90 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
1aca0 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
1acb0 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
1acc0 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
1acd0 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
1ace0 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
1acf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
1ad00 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1ad10 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
1ad20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
1ad30 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
1ad40 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
1ad50 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
1ad60 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
1ad70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1ad80 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
1ad90 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
1ada0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
1adb0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
1adc0 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
1add0 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
1ade0 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
1adf0 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
1ae00 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b  nt winNolockLock
1ae10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1ae20 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
1ae30 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1ae40 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55 53  ETER(id);.  UNUS
1ae50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f 63  ED_PARAMETER(loc
1ae60 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  ktype);.  return
1ae70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
1ae80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c  tatic int winNol
1ae90 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
1aea0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1aeb0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
1aec0 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
1aed0 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20  ARAMETER(id);.  
1aee0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1aef0 28 70 52 65 73 4f 75 74 29 3b 0a 20 20 72 65 74  (pResOut);.  ret
1af00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1af10 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ..static int win
1af20 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  NolockUnlock(sql
1af30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1af40 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
1af50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1af60 28 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (id);.  UNUSED_P
1af70 41 52 41 4d 45 54 45 52 28 6c 6f 63 6b 74 79 70  ARAMETER(locktyp
1af80 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
1af90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  ITE_OK;.}../****
1afa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1afb0 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
1afc0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1afd0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1aff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1b040 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
1b050 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
1b060 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
1b070 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
1b080 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
1b090 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1b0a0 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
1b0b0 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
1b0c0 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
1b0d0 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
1b0e0 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
1b0f0 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
1b100 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
1b110 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
1b120 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1b130 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
1b140 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
1b150 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
1b160 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
1b170 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
1b180 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
1b190 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
1b1a0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
1b1b0 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
1b1c0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1b1d0 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
1b1e0 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
1b1f0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
1b200 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
1b210 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1b220 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
1b230 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74  thods used for t
1b240 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
1b250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1b260 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
1b270 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20  te3_vfs *, char 
1b280 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
1b290 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
1b2a0 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42  oid *);.static B
1b2b0 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
1b2c0 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e  tterAndColon(con
1b2d0 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a  st char *);../*.
1b2e0 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
1b2f0 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
1b300 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1b310 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
1b320 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1b330 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1b340 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1b350 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
1b360 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
1b370 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  d;.  OSTRACE(("F
1b380 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70  CNTL file=%p, op
1b390 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c  =%d, pArg=%p\n",
1b3a0 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70   pFile->h, op, p
1b3b0 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28  Arg));.  switch(
1b3c0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1b3d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1b3e0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1b3f0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1b400 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
1b410 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b420 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b430 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1b440 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1b450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b460 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1b470 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1b480 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
1b490 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1b4a0 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
1b4b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
1b4c0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1b4d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1b4e0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1b4f0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1b500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b510 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1b520 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
1b530 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
1b540 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
1b550 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
1b560 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b570 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1b580 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1b590 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1b5a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b5b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1b5c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1b5d0 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
1b5e0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1b5f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
1b600 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
1b610 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
1b620 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1b630 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
1b640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b660 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1b670 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
1b680 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
1b690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
1b6a0 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
1b6b0 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
1b6c0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b6d0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
1b6e0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
1b6f0 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
1b700 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
1b710 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1b720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b740 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b750 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
1b760 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
1b770 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1b780 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
1b790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1b7a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b7b0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b7c0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1b7d0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1b7e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b7f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1b800 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1b810 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1b820 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
1b830 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
1b840 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
1b850 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
1b860 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1b870 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1b880 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1b890 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1b8a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b8b0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1b8c0 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
1b8d0 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
1b8e0 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
1b8f0 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
1b900 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
1b910 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1b920 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1b930 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1b940 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1b950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b960 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1b970 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1b980 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1b990 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1b9a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1b9b0 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1b9c0 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1b9d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b9e0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1b9f0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1ba00 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1ba10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ba20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ba30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
1ba40 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
1ba50 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
1ba60 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
1ba70 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
1ba80 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
1ba90 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
1baa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bab0 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
1bac0 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
1bad0 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
1bae0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
1baf0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
1bb00 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
1bb10 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
1bb20 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
1bb30 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
1bb40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1bb50 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1bb60 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1bb70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1bb80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bb90 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1bba0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
1bbb0 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c 45 3a  IN32_GET_HANDLE:
1bbc0 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c   {.      LPHANDL
1bbd0 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41  E phFile = (LPHA
1bbe0 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20  NDLE)pArg;.     
1bbf0 20 2a 70 68 46 69 6c 65 20 3d 20 70 46 69 6c 65   *phFile = pFile
1bc00 2d 3e 68 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ->h;.      OSTRA
1bc10 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1bc20 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1bc30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1bc40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1bc50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1bc60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1bc70 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  T.    case SQLIT
1bc80 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45  E_FCNTL_WIN32_SE
1bc90 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20  T_HANDLE: {.    
1bca0 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
1bcb0 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41  e = (LPHANDLE)pA
1bcc0 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45  rg;.      HANDLE
1bcd0 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c   hOldFile = pFil
1bce0 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c  e->h;.      pFil
1bcf0 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a  e->h = *phFile;.
1bd00 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20        *phFile = 
1bd10 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20  hOldFile;.      
1bd20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1bd30 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46  oldFile=%p, newF
1bd40 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1bd50 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1bd60 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65          hOldFile
1bd70 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1bd80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bd90 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
1bda0 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  if.    case SQLI
1bdb0 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
1bdc0 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
1bdd0 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b  har *zTFile = 0;
1bde0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1bdf0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
1be00 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46  File->pVfs, &zTF
1be10 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
1be20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1be30 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
1be40 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
1be50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
1be60 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1be70 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1be80 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
1be90 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1bea0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1beb0 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  c;.    }.#if SQL
1bec0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1bed0 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
1bee0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
1bef0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  IZE: {.      i64
1bf00 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36   newLimit = *(i6
1bf10 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  4*)pArg;.      i
1bf20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bf30 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  K;.      if( new
1bf40 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
1bf50 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1bf60 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
1bf70 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
1bf80 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
1bf90 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  p;.      }..    
1bfa0 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
1bfb0 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20 62  f newLimit may b
1bfc0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 73  e eventually cas
1bfd0 74 20 74 6f 20 28 53 49 5a 45 5f 54 29 20 61 6e  t to (SIZE_T) an
1bfe0 64 20 70 61 73 73 65 64 0a 20 20 20 20 20 20 2a  d passed.      *
1bff0 2a 20 74 6f 20 4d 61 70 56 69 65 77 4f 66 46 69  * to MapViewOfFi
1c000 6c 65 28 29 2e 20 52 65 73 74 72 69 63 74 20 69  le(). Restrict i
1c010 74 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20  ts value to 2GB 
1c020 69 66 20 28 53 49 5a 45 5f 54 29 20 69 73 20 6e  if (SIZE_T) is n
1c030 6f 74 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 6c  ot at.      ** l
1c040 65 61 73 74 20 61 20 36 34 2d 62 69 74 20 74 79  east a 64-bit ty
1c050 70 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  pe. */.      if(
1c060 20 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73   newLimit>0 && s
1c070 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3c 38 20  izeof(SIZE_T)<8 
1c080 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
1c090 6d 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20  mit = (newLimit 
1c0a0 26 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20  & 0x7FFFFFFF);. 
1c0b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28       }..      *(
1c0c0 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  i64*)pArg = pFil
1c0d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  e->mmapSizeMax;.
1c0e0 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1c0f0 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69  it>=0 && newLimi
1c100 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t!=pFile->mmapSi
1c110 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e  zeMax && pFile->
1c120 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a  nFetchOut==0 ){.
1c130 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
1c140 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
1c150 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69  Limit;.        i
1c160 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
1c170 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1c180 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1c190 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
1c1a0 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
1c1b0 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
1c1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c1d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1c1e0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1c1f0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
1c200 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1c210 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1c220 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
1c230 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52  endif.  }.  OSTR
1c240 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1c250 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  =%p, rc=SQLITE_N
1c260 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c  OTFOUND\n", pFil
1c270 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
1c280 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1c290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c2a0 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
1c2b0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
1c2c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
1c2d0 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
1c2e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1c2f0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
1c300 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
1c310 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
1c320 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
1c330 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
1c340 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
1c350 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
1c360 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
1c370 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
1c380 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
1c390 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
1c3a0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
1c3b0 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
1c3c0 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
1c3d0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
1c3e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
1c3f0 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
1c400 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
1c410 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
1c420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c430 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71  winSectorSize(sq
1c440 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1c450 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72  .  (void)id;.  r
1c460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1c470 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1c480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c490 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65  n a vector of de
1c4a0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1c4b0 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tics..*/.static 
1c4c0 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61  int winDeviceCha
1c4d0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
1c4e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
1c4f0 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28    winFile *p = (
1c500 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72  winFile*)id;.  r
1c510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1c520 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
1c530 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20  HEN_OPEN |.     
1c540 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61      ((p->ctrlFla
1c550 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f  gs & WINFILE_PSO
1c560 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  W)?SQLITE_IOCAP_
1c570 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1c580 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE:0);.}../*.**
1c590 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e   Windows will on
1c5a0 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74  ly let you creat
1c5b0 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70  e file view mapp
1c5c0 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63  ings.** on alloc
1c5d0 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75  ation size granu
1c5e0 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65  larity boundarie
1c5f0 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c  s..** During sql
1c600 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1c610 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d  e do a GetSystem
1c620 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74  Info().** to get
1c630 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79   the granularity
1c640 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
1c650 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e   SYSTEM_INFO win
1c660 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65  SysInfo;..#ifnde
1c670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1c680 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  L../*.** Helper 
1c690 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
1c6a0 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
1c6b0 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
1c6c0 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
1c6d0 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
1c6e0 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
1c6f0 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  winLockInfo obje
1c700 63 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  cts used by.** t
1c710 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
1c720 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68   which may be sh
1c730 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
1c740 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
1c750 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d  Function winShmM
1c760 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
1c770 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
1c780 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
1c790 75 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20  utex.** is held 
1c7a0 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
1c7b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c7c0 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
1c7d0 74 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a  t of assert().**
1c7e0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
1c7f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ..**.**   winShm
1c800 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
1c810 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53      assert( winS
1c820 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
1c830 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76  .**   winShmLeav
1c840 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74  eMutex().*/.stat
1c850 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ic sqlite3_mutex
1c860 20 2a 77 69 6e 42 69 67 4c 6f 63 6b 20 3d 20 30   *winBigLock = 0
1c870 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
1c880 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
1c890 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
1c8a0 6d 75 74 65 78 5f 65 6e 74 65 72 28 77 69 6e 42  mutex_enter(winB
1c8b0 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61 74 69  igLock);.}.stati
1c8c0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61  c void winShmLea
1c8d0 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
1c8e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c8f0 65 61 76 65 28 77 69 6e 42 69 67 4c 6f 63 6b 29  eave(winBigLock)
1c900 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ;.}.#ifndef NDEB
1c910 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  UG.static int wi
1c920 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f  nShmMutexHeld(vo
1c930 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
1c940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c950 64 28 77 69 6e 42 69 67 4c 6f 63 6b 29 3b 0a 7d  d(winBigLock);.}
1c960 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
1c970 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
1c980 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
1c990 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
1c9a0 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
1c9b0 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
1c9c0 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
1c9d0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1c9e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1c9f0 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
1ca00 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
1ca10 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
1ca20 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
1ca30 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
1ca40 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1ca50 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
1ca60 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
1ca70 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
1ca80 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
1ca90 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
1caa0 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
1cab0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
1cac0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1cad0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1cae0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1caf0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1cb00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1cb10 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1cb20 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1cb30 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1cb40 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a  *      pNext.**.
1cb50 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1cb60 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1cb70 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
1cb80 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1cb90 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69  d:.**.**      fi
1cba0 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
1cbb0 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
1cbc0 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
1cbd0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
1cbe0 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
1cbf0 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
1cc00 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
1cc10 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
1cc20 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
1cc30 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
1cc40 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
1cc50 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
1cc60 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
1cc70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
1cc80 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
1cc90 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
1cca0 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
1ccb0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
1ccc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1ccd0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
1cce0 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
1ccf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1cd00 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
1cd10 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
1cd20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
1cd30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1cd40 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
1cd50 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
1cd60 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1cd80 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
1cd90 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
1cda0 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
1cdb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1cdc0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1cdd0 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20  u8 isUnlocked;  
1cde0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1cdf0 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63  ue if no DMS loc
1ce00 6b 20 68 65 6c 64 20 2a 2f 0a 0a 20 20 73 74 72  k held */..  str
1ce10 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
1ce20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce40 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
1ce50 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
1ce60 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
1ce70 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
1ce80 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
1ce90 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
1cea0 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
1ceb0 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
1cec0 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1ced0 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cef0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
1cf00 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1cf10 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
1cf20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1cf40 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
1cf50 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
1cf60 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
1cf70 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
1cf80 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
1cf90 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
1cfa0 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
1cfb0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1cfc0 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1cfd0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
1cfe0 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20  _OS_TRACE).  u8 
1cff0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1d000 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1d010 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d  available winShm
1d020 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
1d030 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
1d040 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20  global array of 
1d050 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
1d060 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  bjects..**.** Th
1d070 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  e winShmMutexHel
1d080 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
1d090 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1d0a0 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c  r writing this l
1d0b0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77  ist..*/.static w
1d0c0 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68  inShmNode *winSh
1d0d0 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  mNodeList = 0;..
1d0e0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
1d0f0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
1d100 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
1d110 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
1d120 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
1d130 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
1d140 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
1d150 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1d160 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
1d170 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
1d180 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
1d190 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
1d1a0 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
1d1b0 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  **.**    winShm.
1d1c0 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77  pShmNode.**    w
1d1d0 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  inShm.id.**.** A
1d1e0 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
1d1f0 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
1d200 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d   The winShm.pShm
1d210 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  Node->mutex must
1d220 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
1d230 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
1d240 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
1d250 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  s..*/.struct win
1d260 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  Shm {.  winShmNo
1d270 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
1d280 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1d290 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ying winShmNode 
1d2a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53  object */.  winS
1d2b0 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
1d2c0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77         /* Next w
1d2d0 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  inShm with the s
1d2e0 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ame winShmNode *
1d2f0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d310 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
1d320 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  g the winShmNode
1d330 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
1d340 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1d350 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1d360 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1d370 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
1d380 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1d390 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1d3a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1d3b0 65 6c 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  eld */.#if defin
1d3c0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1d3d0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1d3e0 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
1d3f0 29 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  ).  u8 id;      
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d410 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
1d420 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  nection with its
1d430 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23   winShmNode */.#
1d440 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1d450 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
1d460 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
1d470 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41  efine WIN_SHM_BA
1d480 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
1d490 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
1d4a0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
1d4b0 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
1d4c0 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20  ine WIN_SHM_DMS 
1d4d0 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45     (WIN_SHM_BASE
1d4e0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1d4f0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
1d500 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
1d510 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c  Apply advisory l
1d520 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62  ocks for all n b
1d530 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ytes beginning a
1d540 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  t ofst..*/.#defi
1d550 6e 65 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20  ne WINSHM_UNLCK 
1d560 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48   1.#define WINSH
1d570 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69  M_RDLCK  2.#defi
1d580 6e 65 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20  ne WINSHM_WRLCK 
1d590 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
1d5a0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  nShmSystemLock(.
1d5b0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46    winShmNode *pF
1d5c0 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79  ile,    /* Apply
1d5d0 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
1d5e0 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
1d5f0 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
1d600 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
1d610 20 20 20 20 20 2f 2a 20 57 49 4e 53 48 4d 5f 55       /* WINSHM_U
1d620 4e 4c 43 4b 2c 20 57 49 4e 53 48 4d 5f 52 44 4c  NLCK, WINSHM_RDL
1d630 43 4b 2c 20 6f 72 20 57 49 4e 53 48 4d 5f 57 52  CK, or WINSHM_WR
1d640 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
1d650 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
1d660 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
1d670 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
1d680 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
1d690 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
1d6a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d6b0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
1d6c0 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
1d6d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1d6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d6f0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
1d700 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
1d710 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
1d720 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
1d730 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1d740 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1d750 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1d760 65 72 74 28 20 70 46 69 6c 65 2d 3e 6e 52 65 66  ert( pFile->nRef
1d770 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
1d780 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d  utex_held(pFile-
1d790 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 4f 53  >mutex) );..  OS
1d7a0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1d7b0 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
1d7c0 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
1d7d0 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ze=%d\n",.      
1d7e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
1d7f0 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f  e.h, lockType, o
1d800 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20  fst, nByte));.. 
1d810 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
1d820 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
1d830 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
1d840 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 57 49 4e  f( lockType==WIN
1d850 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  SHM_UNLCK ){.   
1d860 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46   rc = winUnlockF
1d870 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c  ile(&pFile->hFil
1d880 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  e.h, ofst, 0, nB
1d890 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
1d8a0 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
1d8b0 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
1d8c0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1d8d0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20    DWORD dwFlags 
1d8e0 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  = LOCKFILE_FAIL_
1d8f0 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20  IMMEDIATELY;.   
1d900 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d   if( lockType ==
1d910 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 29 20   WINSHM_WRLCK ) 
1d920 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46  dwFlags |= LOCKF
1d930 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
1d940 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  CK;.    rc = win
1d950 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
1d960 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67  >hFile.h, dwFlag
1d970 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  s, ofst, 0, nByt
1d980 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  e, 0);.  }..  if
1d990 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20  ( rc!= 0 ){.    
1d9a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1d9c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1d9d0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1d9e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1d9f0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
1da00 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1da10 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63  CK file=%p, func
1da20 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20  =%s, errno=%lu, 
1da30 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1da40 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
1da50 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d  e.h, (lockType =
1da60 3d 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 29 20  = WINSHM_UNLCK) 
1da70 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  ? "winUnlockFile
1da80 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22  " :.           "
1da90 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46  winLockFile", pF
1daa0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
1dab0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1dac0 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  c)));..  return 
1dad0 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1dae0 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1daf0 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73  VFS methods */.s
1db00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
1db10 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63  n(sqlite3_vfs*,c
1db20 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
1db30 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74  e3_file*,int,int
1db40 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
1db50 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  inDelete(sqlite3
1db60 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61  _vfs *,const cha
1db70 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r*,int);../*.** 
1db80 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d  Purge the winShm
1db90 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
1dba0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
1dbb0 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  h winShmNode.nRe
1dbc0 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
1dbd0 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
1dbe0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1dbf0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
1dc00 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
1dc10 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
1dc20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1dc30 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
1dc40 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28  oid winShmPurge(
1dc50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1dc60 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  s, int deleteFla
1dc70 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  g){.  winShmNode
1dc80 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e   **pp;.  winShmN
1dc90 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ode *p;.  assert
1dca0 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
1dcb0 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  d() );.  OSTRACE
1dcc0 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
1dcd0 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67  =%lu, deleteFlag
1dce0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1dcf0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1dd00 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65  rocessId(), dele
1dd10 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d  teFlag));.  pp =
1dd20 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   &winShmNodeList
1dd30 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20  ;.  while( (p = 
1dd40 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  *pp)!=0 ){.    i
1dd50 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  f( p->nRef==0 ){
1dd60 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1dd70 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
1dd80 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   ){ sqlite3_mute
1dd90 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
1dda0 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ; }.      for(i=
1ddb0 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
1ddc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42   i++){.        B
1ddd0 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61  OOL bRc = osUnma
1dde0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61  pViewOfFile(p->a
1ddf0 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b  Region[i].pMap);
1de00 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1de10 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d  (("SHM-PURGE-UNM
1de20 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  AP pid=%lu, regi
1de30 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  on=%d, rc=%s\n",
1de40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de50 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1de60 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52  ocessId(), i, bR
1de70 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
1de80 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  ed"));.        U
1de90 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56  NUSED_VARIABLE_V
1dea0 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20  ALUE(bRc);.     
1deb0 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65     bRc = osClose
1dec0 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f  Handle(p->aRegio
1ded0 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20  n[i].hMap);.    
1dee0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1def0 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69  M-PURGE-CLOSE pi
1df00 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1df10 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1df30 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1df40 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
1df50 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1df60 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
1df70 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
1df80 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bRc);.      }.  
1df90 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65      if( p->hFile
1dfa0 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68  .h!=NULL && p->h
1dfb0 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f  File.h!=INVALID_
1dfc0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
1dfd0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1dfe0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1dff0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f  ;.        winClo
1e000 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
1e010 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20   *)&p->hFile);. 
1e020 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1e030 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1e040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e050 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b  f( deleteFlag ){
1e060 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1e070 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e080 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e090 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
1e0a0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77  loc();.        w
1e0b0 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  inDelete(pVfs, p
1e0c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  ->zFilename, 0);
1e0d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e0e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
1e0f0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
1e100 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1e110 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
1e120 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78     *pp = p->pNex
1e130 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1e140 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e  _free(p->aRegion
1e150 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e160 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65  _free(p);.    }e
1e170 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20  lse{.      pp = 
1e180 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  &p->pNext;.    }
1e190 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1e1a0 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e  e DMS lock has n
1e1b0 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b 65  ot yet been take
1e1c0 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70 53  n on shm file pS
1e1d0 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74 20  hmNode. Attempt 
1e1e0 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f  to.** take it no
1e1f0 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  w. Return SQLITE
1e200 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
1e210 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1e220 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
1e230 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
1e240 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74  f the DMS cannot
1e250 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61 75   be locked becau
1e260 73 65 20 74 68 69 73 20 69 73 20 61 20 72 65 61  se this is a rea
1e270 64 6f 6e 6c 79 5f 73 68 6d 3d 31 0a 2a 2a 20 63  donly_shm=1.** c
1e280 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f  onnection and no
1e290 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
1e2a0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c  lready holds a l
1e2b0 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ock, return.** S
1e2c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
1e2d0 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20  ANTINIT and set 
1e2e0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
1e2f0 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  cked=1..*/.stati
1e300 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 53 68 61  c int winLockSha
1e310 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 53 68 6d  redMemory(winShm
1e320 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29 7b  Node *pShmNode){
1e330 0a 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 53  .  int rc = winS
1e340 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1e350 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52  mNode, WINSHM_WR
1e360 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1e370 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 1);..  if( rc=
1e380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e390 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1e3a0 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
1e3b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
1e3c0 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20  Unlocked = 1;.  
1e3d0 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
1e3e0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1e3f0 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e  INSHM_UNLCK, WIN
1e400 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1e410 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e420 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
1e430 4e 49 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NIT;.    }else i
1e440 66 28 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28  f( winTruncate((
1e450 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
1e460 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1e470 30 29 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  0) ){.      winS
1e480 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1e490 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e  mNode, WINSHM_UN
1e4a0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1e4b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 1);.      retu
1e4c0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1e4d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
1e4e0 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
1e4f0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e510 22 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65  "winLockSharedMe
1e520 6d 6f 72 79 22 2c 20 70 53 68 6d 4e 6f 64 65 2d  mory", pShmNode-
1e530 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
1e540 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
1e550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e560 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c     winShmSystemL
1e570 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49  ock(pShmNode, WI
1e580 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  NSHM_UNLCK, WIN_
1e590 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d  SHM_DMS, 1);.  }
1e5a0 0a 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 53 68  ..  return winSh
1e5b0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1e5c0 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c  Node, WINSHM_RDL
1e5d0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1e5e0 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   1);.}../*.** Op
1e5f0 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  en the shared-me
1e600 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
1e610 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61  ated with databa
1e620 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a  se file pDbFd..*
1e630 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
1e640 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
1e650 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
1e660 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
1e670 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
1e680 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
1e690 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
1e6a0 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
1e6b0 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
1e6c0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
1e6d0 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
1e6e0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
1e6f0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
1e700 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  r cleared..*/.st
1e710 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
1e720 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e  SharedMemory(win
1e730 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20  File *pDbFd){.  
1e740 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70  struct winShm *p
1e750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e760 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1e770 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65  tion to be opene
1e780 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
1e790 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e *pShmNode = 0;
1e7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e7b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
1e7c0 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1e7d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e7e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e7f0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1e800 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1e810 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
1e820 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
1e830 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68   allocated winSh
1e840 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  mNode */.  int n
1e850 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e870 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69   Size of zName i
1e880 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73  n bytes */..  as
1e890 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
1e8a0 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f  m==0 );    /* No
1e8b0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  t previously ope
1e8c0 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ned */..  /* All
1e8d0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1e8e0 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f  the new sqlite3_
1e8f0 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73  shm object.  Als
1e900 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a  o speculatively.
1e910 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70    ** allocate sp
1e920 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69  ace for a new wi
1e930 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c  nShmNode and fil
1e940 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20  ename..  */.  p 
1e950 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1e960 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  ero( sizeof(*p) 
1e970 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1e980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e990 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1e9a0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1e9b0 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
1e9c0 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
1e9d0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1e9e0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
1e9f0 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
1ea00 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
1ea10 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
1ea20 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1ea30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ea40 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
1ea50 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  .  }.  pNew->zFi
1ea60 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
1ea70 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
1ea80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
1ea90 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
1eaa0 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
1eab0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1eac0 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
1ead0 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
1eae0 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
1eaf0 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ame);..  /* Look
1eb00 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
1eb10 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
1eb20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
1eb30 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
1eb40 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
1eb50 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
1eb60 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
1eb70 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
1eb80 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
1eb90 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
1eba0 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
1ebb0 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
1ebc0 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
1ebd0 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
1ebe0 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
1ebf0 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
1ec00 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
1ec10 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
1ec20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
1ec30 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
1ec40 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
1ec50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1ec60 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
1ec70 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
1ec80 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
1ec90 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1eca0 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
1ecb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ecc0 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
1ecd0 20 20 20 20 69 6e 74 20 69 6e 46 6c 61 67 73 20      int inFlags 
1ece0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  = SQLITE_OPEN_WA
1ecf0 4c 3b 0a 20 20 20 20 69 6e 74 20 6f 75 74 46 6c  L;.    int outFl
1ed00 61 67 73 20 3d 20 30 3b 0a 0a 20 20 20 20 70 53  ags = 0;..    pS
1ed10 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
1ed20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
1ed30 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
1ed40 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
1ed50 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
1ed60 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
1ed70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
1ed80 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1ed90 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
1eda0 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
1edb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1edc0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1edd0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
1ede0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1edf0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1ee00 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1ee10 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
1ee20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
1ee30 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
1ee40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1ee50 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
1ee60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
1ee70 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1ee80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
1ee90 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 75 72  f( 0==sqlite3_ur
1eea0 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
1eeb0 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
1eec0 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20  y_shm", 0) ){.  
1eed0 20 20 20 20 69 6e 46 6c 61 67 73 20 7c 3d 20 53      inFlags |= S
1eee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1eef0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1ef00 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 7d  EN_CREATE;.    }
1ef10 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 46 6c  else{.      inFl
1ef20 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
1ef30 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
1ef40 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f   }.    rc = winO
1ef50 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
1ef60 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1ef70 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
1ef80 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1ef90 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
1efa0 3e 68 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  >hFile,.        
1efb0 20 20 20 20 20 20 20 20 20 69 6e 46 6c 61 67 73           inFlags
1efc0 2c 20 26 6f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , &outFlags);.  
1efd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1efe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1eff0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 72 63  = winLogError(rc
1f000 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1f010 28 29 2c 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22  (), "winOpenShm"
1f020 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f030 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1f040 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
1f050 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1f060 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
1f070 20 20 69 66 28 20 6f 75 74 46 6c 61 67 73 3d 3d    if( outFlags==
1f080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f090 4f 4e 4c 59 20 29 20 70 53 68 6d 4e 6f 64 65 2d  ONLY ) pShmNode-
1f0a0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
1f0b0 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ..    rc = winLo
1f0c0 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  ckSharedMemory(p
1f0d0 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66  ShmNode);.    if
1f0e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f0f0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45  && rc!=SQLITE_RE
1f100 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20  ADONLY_CANTINIT 
1f110 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1f120 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
1f130 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
1f140 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
1f150 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
1f160 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1f170 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
1f180 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f190 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1f1a0 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
1f1b0 53 5f 54 52 41 43 45 29 0a 20 20 70 2d 3e 69 64  S_TRACE).  p->id
1f1c0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1f1d0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1f1e0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1f1f0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1f200 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1f210 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1f220 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1f230 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1f240 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1f250 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1f260 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1f270 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1f280 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1f290 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1f2a0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1f2b0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1f2c0 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1f2d0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1f2e0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1f2f0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1f300 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1f310 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1f320 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1f330 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1f340 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1f350 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1f360 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1f370 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1f380 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20  ShmNode->mutex. 
1f390 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1f3a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f3b0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1f3c0 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1f3d0 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1f3e0 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1f3f0 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1f400 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f410 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1f420 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1f430 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
1f440 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
1f450 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
1f460 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  :.  winShmSystem
1f470 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1f480 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e  INSHM_UNLCK, WIN
1f490 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1f4a0 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
1f4b0 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20  d->pVfs, 0);    
1f4c0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
1f4d0 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
1f4e0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
1f4f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1f500 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f510 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  New);.  winShmLe
1f520 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
1f530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f540 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
1f550 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
1f560 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
1f570 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
1f580 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
1f590 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
1f5a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1f5b0 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  nShmUnmap(.  sql
1f5c0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1f5d0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1f5e0 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
1f5f0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1f600 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
1f610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
1f620 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
1f630 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
1f640 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
1f650 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
1f660 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
1f670 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
1f680 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
1f690 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1f6a0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
1f6b0 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
1f6c0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
1f6d0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1f6e0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1f6f0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
1f700 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
1f710 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1f720 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
1f730 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
1f740 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1f750 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
1f760 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
1f770 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f780 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
1f790 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
1f7a0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
1f7b0 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
1f7c0 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
1f7d0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
1f7e0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
1f7f0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1f800 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1f810 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1f820 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
1f830 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
1f840 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
1f850 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
1f860 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
1f870 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
1f880 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
1f890 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1f8a0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
1f8b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f8c0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1f8d0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
1f8e0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
1f8f0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
1f900 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
1f910 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
1f920 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1f930 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
1f940 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
1f950 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
1f960 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
1f970 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
1f980 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
1f990 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1f9a0 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
1f9b0 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
1f9c0 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
1f9d0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1f9e0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1f9f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1fa00 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
1fa10 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
1fa20 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1fa30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fa40 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
1fa50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1fa60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1fa70 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
1fa80 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1fa90 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
1faa0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1fab0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
1fac0 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
1fad0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1fae0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
1faf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fb00 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
1fb10 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1fb20 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1fb50 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
1fb60 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1fb70 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
1fb80 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
1fb90 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
1fba0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1fbb0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
1fbc0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
1fbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fbe0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
1fbf0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
1fc00 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1fc30 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
1fc40 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
1fc50 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1fc60 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1fc70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fc80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1fc90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1fca0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
1fcb0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
1fce0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
1fcf0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
1fd00 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
1fd10 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
1fd20 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
1fd30 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
1fd40 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
1fd50 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1fd60 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
1fd70 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
1fd80 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1fd90 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1fda0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
1fdb0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1fdc0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1fdd0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1fde0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
1fdf0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1fe00 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1fe10 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1fe20 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
1fe30 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
1fe40 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
1fe50 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
1fe60 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
1fe70 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
1fe80 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
1fe90 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
1fea0 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
1feb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1fec0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1fed0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
1fee0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1fef0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
1ff00 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
1ff10 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1ff20 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1ff30 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
1ff40 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
1ff50 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
1ff60 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
1ff70 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1ff80 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1ff90 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1ffa0 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
1ffb0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
1ffc0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1ffd0 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
1ffe0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
1fff0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
20000 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
20010 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
20020 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
20030 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
20040 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
20050 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
20060 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
20070 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
20080 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d  pShmNode, WINSHM
20090 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _UNLCK, ofst+WIN
200a0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
200b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
200c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
200d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
200e0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
200f0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
20100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20110 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
20120 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
20130 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
20140 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
20150 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
20160 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
20170 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
20180 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
20190 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
201a0 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
201b0 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
201c0 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
201d0 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
201e0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
201f0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
20200 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
20210 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
20220 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
20230 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
20240 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
20250 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
20260 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
20270 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
20280 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
20290 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
202a0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
202b0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
202c0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
202d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
202e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
202f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20300 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
20310 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
20320 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
20330 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
20340 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
20350 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
20360 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
20370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20380 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
20390 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
203a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
203b0 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
203c0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
203d0 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_RDLCK, ofst+
203e0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
203f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20400 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20410 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
20420 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
20430 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
20440 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
20450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20460 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
20470 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
20480 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20490 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
204a0 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
204b0 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
204c0 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
204d0 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
204e0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
204f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
20500 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
20510 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
20520 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
20530 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
20540 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
20550 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
20560 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
20570 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
20580 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
20590 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
205a0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
205b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
205c0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
205d0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
205e0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
205f0 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
20600 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
20610 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
20620 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
20630 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
20640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20650 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20660 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
20670 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
20680 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57  hmNode, WINSHM_W
20690 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  RLCK, ofst+WIN_S
206a0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
206b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
206c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
206d0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
206e0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
206f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
20700 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
20710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20720 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
20730 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
20740 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
20750 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
20760 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c   pid=%lu, id=%d,
20770 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78   sharedMask=%03x
20780 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c  , exclMask=%03x,
20790 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
207a0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
207b0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
207c0 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d  ->id, p->sharedM
207d0 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
207e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
207f0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
20800 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20810 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
20820 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
20830 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
20840 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
20850 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  mory..**.** All 
20860 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
20870 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
20880 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
20890 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
208a0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
208b0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
208c0 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
208d0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
208e0 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
208f0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
20900 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
20910 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
20920 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
20930 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
20940 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c  METER(fd);.  sql
20950 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65  ite3MemoryBarrie
20960 72 28 29 3b 20 20 20 2f 2a 20 63 6f 6d 70 69 6c  r();   /* compil
20970 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72  er-defined memor
20980 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 23 69 66  y barrier */.#if
20990 6e 64 65 66 20 73 71 6c 69 74 65 33 4d 65 6d 6f  ndef sqlite3Memo
209a0 72 79 42 61 72 72 69 65 72 5f 49 53 5f 52 45 4c  ryBarrier_IS_REL
209b0 49 41 42 4c 45 0a 20 20 77 69 6e 53 68 6d 45 6e  IABLE.  winShmEn
209c0 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20  terMutex();     
209d0 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c    /* Also mutex,
209e0 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20   for redundancy 
209f0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  */.  winShmLeave
20a00 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64 69 66 0a  Mutex();.#endif.
20a10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20a20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20a30 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
20a40 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
20a50 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  Region of the.**
20a60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
20a70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
20a80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20a90 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
20aa0 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72  ry regions.** ar
20ab0 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
20ac0 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
20ad0 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
20ae0 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
20af0 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e  gion.** bytes in
20b00 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
20b10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
20b20 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
20b30 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
20b40 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
20b50 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
20b60 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69  se, if the isWri
20b70 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  te parameter is 
20b80 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
20b90 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
20ba0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
20bb0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
20bc0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
20bd0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
20be0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
20bf0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
20c00 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
20c10 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
20c20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
20c30 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74  ed. If.** isWrit
20c40 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  e is non-zero an
20c50 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
20c60 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20c70 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
20c80 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
20c90 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
20ca0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
20cb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
20cc0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
20cd0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
20ce0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
20cf0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
20d00 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
20d10 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
20d20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
20d30 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
20d40 69 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20  is processes.** 
20d50 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
20d60 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
20d70 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
20d80 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
20d90 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72   mapped.** memor
20da0 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
20db0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
20dc0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61  tic int winShmMa
20dd0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
20de0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
20df0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
20e00 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
20e10 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
20e20 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
20e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
20e40 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
20e50 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
20e60 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20e70 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20e80 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
20e90 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20   isWrite,       
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20eb0 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
20ec0 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
20ed0 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
20ee0 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
20ef0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
20f00 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
20f10 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
20f20 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
20f30 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68  d;.  winShm *pSh
20f40 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  m = pDbFd->pShm;
20f50 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
20f60 53 68 6d 4e 6f 64 65 3b 0a 20 20 44 57 4f 52 44  ShmNode;.  DWORD
20f70 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
20f80 52 45 41 44 57 52 49 54 45 3b 0a 20 20 44 57 4f  READWRITE;.  DWO
20f90 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f  RD flags = FILE_
20fa0 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
20fb0 5f 4d 41 50 5f 52 45 41 44 3b 0a 20 20 69 6e 74  _MAP_READ;.  int
20fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20fd0 0a 0a 20 20 69 66 28 20 21 70 53 68 6d 20 29 7b  ..  if( !pShm ){
20fe0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
20ff0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
21000 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
21010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
21020 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 53 68  turn rc;.    pSh
21030 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  m = pDbFd->pShm;
21040 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20  .  }.  pShmNode 
21050 3d 20 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65  = pShm->pShmNode
21060 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
21070 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
21080 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
21090 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
210a0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ocked ){.    rc 
210b0 3d 20 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d  = winLockSharedM
210c0 65 6d 6f 72 79 28 70 53 68 6d 4e 6f 64 65 29 3b  emory(pShmNode);
210d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
210e0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 68  ITE_OK ) goto sh
210f0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 70  mpage_out;.    p
21100 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63  ShmNode->isUnloc
21110 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ked = 0;.  }.  a
21120 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d  ssert( szRegion=
21130 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67  =pShmNode->szReg
21140 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ion || pShmNode-
21150 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a  >nRegion==0 );..
21160 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
21170 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
21180 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
21190 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b  hmRegion *apNew;
211a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
211b0 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61  w aRegion[] arra
211c0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
211d0 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29  te = (iRegion+1)
211e0 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d  *szRegion;  /* M
211f0 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
21200 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
21210 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21220 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
21230 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
21240 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78  ize of wal-index
21250 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53   file */..    pS
21260 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
21270 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
21280 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
21290 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
212a0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
212b0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
212c0 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  ess space..    *
212d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
212e0 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
212f0 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
21300 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
21310 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61  ile is.    ** la
21320 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
21330 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
21340 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
21350 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   */.    rc = win
21360 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
21370 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
21380 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b  de->hFile, &sz);
21390 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
213a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
213b0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
213c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
213d0 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74  MSIZE, osGetLast
213e0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
21410 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
21420 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
21430 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
21440 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
21450 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
21460 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
21470 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
21480 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
21490 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
214a0 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
214b0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
214c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
214d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
214e0 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
214f0 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
21500 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
21510 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
21520 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
21530 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
21540 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
21550 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
21560 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21570 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
21580 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
21590 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
215a0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
215b0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
215c0 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
215d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
215e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
215f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
21600 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
21610 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
21620 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
21650 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  2", pDbFd->zPath
21660 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
21670 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
21680 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21690 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
216a0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
216b0 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
216c0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
216d0 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
216e0 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d  ew = (struct Shm
216f0 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33  Region *)sqlite3
21700 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20  _realloc64(.    
21710 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
21720 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
21730 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b  1)*sizeof(apNew[
21740 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  0]).    );.    i
21750 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
21760 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
21770 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
21780 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
21790 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
217a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
217b0 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
217c0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
217d0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20  >isReadonly ){. 
217e0 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50       protect = P
217f0 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  AGE_READONLY;.  
21800 20 20 20 20 66 6c 61 67 73 20 3d 20 46 49 4c 45      flags = FILE
21810 5f 4d 41 50 5f 52 45 41 44 3b 0a 20 20 20 20 7d  _MAP_READ;.    }
21820 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68  ..    while( pSh
21830 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
21840 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  iRegion ){.     
21850 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e   HANDLE hMap = N
21860 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ULL;         /* 
21870 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e  file-mapping han
21880 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69  dle */.      voi
21890 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20  d *pMap = 0;    
218a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
218b0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
218c0 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
218d0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68  OS_WINRT.      h
218e0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
218f0 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
21900 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
21910 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
21920 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 42 79  LL, protect, nBy
21930 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
21940 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
21950 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
21960 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61  _WIDE).      hMa
21970 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
21980 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64  MappingW(pShmNod
21990 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
219a0 20 20 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74        NULL, prot
219b0 65 63 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ect, 0, nByte, N
219c0 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
219d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
219e0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
219f0 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  ) && SQLITE_WIN3
21a00 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50  2_CREATEFILEMAPP
21a10 49 4e 47 41 0a 20 20 20 20 20 20 68 4d 61 70 20  INGA.      hMap 
21a20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
21a30 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d  ppingA(pShmNode-
21a40 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
21a50 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63      NULL, protec
21a60 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  t, 0, nByte, NUL
21a70 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69  L.      );.#endi
21a80 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
21a90 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45  ("SHM-MAP-CREATE
21aa0 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
21ab0 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
21ac0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
21ad0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
21ae0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
21af0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
21b00 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  n, nByte,.      
21b10 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20           hMap ? 
21b20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
21b30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
21b40 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
21b50 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e   iOffset = pShmN
21b60 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
21b70 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  egion;.        i
21b80 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
21b90 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
21ba0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
21bb0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
21bc0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
21bd0 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70  NRT.        pMap
21be0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
21bf0 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20  leFromApp(hMap, 
21c00 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  flags,.         
21c10 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66     iOffset - iOf
21c20 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
21c30 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
21c40 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
21c50 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70  lse.        pMap
21c60 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
21c70 6c 65 28 68 4d 61 70 2c 20 66 6c 61 67 73 2c 0a  le(hMap, flags,.
21c80 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69              0, i
21c90 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
21ca0 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
21cb0 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
21cc0 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66         );.#endif
21cd0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
21ce0 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70  (("SHM-MAP-MAP p
21cf0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
21d00 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
21d10 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ze=%d, rc=%s\n",
21d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21d30 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
21d40 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
21d50 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f  ode->nRegion, iO
21d60 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  ffset,.         
21d70 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e          szRegion
21d80 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20  , pMap ? "ok" : 
21d90 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
21da0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
21db0 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Map ){.        p
21dc0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
21dd0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
21de0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
21df0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
21e00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
21e10 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c  MAP, pShmNode->l
21e20 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e40 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c     "winShmMap3",
21e50 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
21e60 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70          if( hMap
21e70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   ) osCloseHandle
21e80 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
21e90 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
21ea0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21eb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
21ec0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
21ed0 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
21ee0 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
21ef0 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
21f00 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
21f10 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
21f20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
21f30 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
21f40 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
21f50 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
21f60 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
21f70 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
21f80 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
21f90 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
21fa0 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
21fb0 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
21fc0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
21fd0 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
21fe0 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
21ff0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
22000 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
22010 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
22020 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
22030 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
22040 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
22050 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
22060 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
22070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
22080 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
22090 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
220a0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
220b0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
220c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
220d0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
220e0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
220f0 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20  ne winShmLock   
22100 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
22110 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
22120 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70  fine winShmUnmap
22130 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
22140 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22150 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
22160 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d   Cleans up the m
22170 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20  apped region of 
22180 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
22190 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  le, if any..*/.#
221a0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
221b0 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63  AP_SIZE>0.static
221c0 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c   int winUnmapfil
221d0 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
221e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ){.  assert( pFi
221f0 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  le!=0 );.  OSTRA
22200 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
22210 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
22220 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70  p, hMap=%p, pMap
22230 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
22240 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a          "mmapSiz
22250 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65  e=%lld, mmapSize
22260 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  Max=%lld\n",.   
22270 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
22280 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
22290 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
222a0 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  Map, pFile->pMap
222b0 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Region,.        
222c0 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
222d0 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ze, pFile->mmapS
222e0 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20  izeMax));.  if( 
222f0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
22300 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  n ){.    if( !os
22310 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
22320 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
22330 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  n) ){.      pFil
22340 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
22350 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
22360 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22370 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
22380 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
22390 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
223b0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
223c0 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75  MMAP\n", osGetCu
223d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
223e0 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  , pFile,.       
223f0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70          pFile->p
22400 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
22410 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
22420 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
22430 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
22440 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
22470 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
22480 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
22490 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
224a0 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
224b0 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
224c0 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
224d0 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map!=NULL ){.   
224e0 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e   if( !osCloseHan
224f0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29  dle(pFile->hMap)
22500 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
22510 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
22520 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
22530 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
22540 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
22550 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
22560 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  p=%p, rc=SQLITE_
22570 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20  IOERR_MMAP\n",. 
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
22590 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
225a0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
225b0 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20  ile->hMap));.   
225c0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
225d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
225e0 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
225f0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
22620 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
22630 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
22640 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
22650 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
22660 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
22670 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
22680 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
22690 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
226a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
226b0 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20  d(), pFile));.  
226c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
226d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
226e0 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
226f0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
22700 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
22710 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
22720 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
22730 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
22740 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
22750 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
22760 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a   new). Or, if.**
22770 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
22780 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
22790 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
227a0 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
227b0 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  ll.** outstandin
227c0 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
227d0 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
227e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
227f0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
22800 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
22810 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
22820 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
22830 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
22840 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67  f.** the mapping
22850 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
22860 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
22870 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
22880 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72  o, then the.** r
22890 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
228a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
228b0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
228c0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
228d0 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
228e0 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
228f0 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
22900 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
22910 75 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  ue configured.**
22920 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
22930 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77  NTL_MMAP_SIZE, w
22940 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
22950 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
22960 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22970 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
22980 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
22990 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
229a0 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
229b0 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
229c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
229d0 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
229e0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
229f0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
22a00 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69  tic int winMapfi
22a10 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c  le(winFile *pFd,
22a20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
22a30 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Byte){.  sqlite3
22a40 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42  _int64 nMap = nB
22a50 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  yte;.  int rc;..
22a60 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d    assert( nMap>=
22a70 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68  0 || pFd->nFetch
22a80 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52  Out==0 );.  OSTR
22a90 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
22aa0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
22ab0 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a  , size=%lld\n",.
22ac0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
22ad0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
22ae0 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29  (), pFd, nByte))
22af0 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  ;..  if( pFd->nF
22b00 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
22b10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
22b20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
22b30 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
22b40 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
22b50 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a  e*)pFd, &nMap);.
22b60 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22b70 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
22b80 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
22b90 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
22ba0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c  ITE_IOERR_FSTAT\
22bb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22bc0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
22bd0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
22be0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22bf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
22c00 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  AT;.    }.  }.  
22c10 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
22c20 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
22c30 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
22c40 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20  pSizeMax;.  }.  
22c50 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65  nMap &= ~(sqlite
22c60 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49  3_int64)(winSysI
22c70 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d  nfo.dwPageSize -
22c80 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70   1);..  if( nMap
22c90 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70  ==0 && pFd->mmap
22ca0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69  Size>0 ){.    wi
22cb0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
22cc0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21  .  }.  if( nMap!
22cd0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
22ce0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
22cf0 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20   = 0;.    DWORD 
22d00 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
22d10 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f  EADONLY;.    DWO
22d20 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f  RD flags = FILE_
22d30 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77  MAP_READ;..    w
22d40 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
22d50 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22d60 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
22d70 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72     if( (pFd->ctr
22d80 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
22d90 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  _RDONLY)==0 ){. 
22da0 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50       protect = P
22db0 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  AGE_READWRITE;. 
22dc0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49       flags |= FI
22dd0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20  LE_MAP_WRITE;.  
22de0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
22df0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
22e00 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
22e10 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
22e20 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  ngFromApp(pFd->h
22e30 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
22e40 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65   nMap, NULL);.#e
22e50 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
22e60 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
22e70 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  E).    pFd->hMap
22e80 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
22e90 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20  appingW(pFd->h, 
22ea0 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
22ed0 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
22ee0 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
22ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
22f20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
22f30 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
22f40 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
22f50 41 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49  AS_ANSI) && SQLI
22f60 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46  TE_WIN32_CREATEF
22f70 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20  ILEMAPPINGA.    
22f80 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
22f90 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
22fa0 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
22fb0 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
22fe0 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
22ff0 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
23020 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
23030 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  fff), NULL);.#en
23040 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d  dif.    if( pFd-
23050 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  >hMap==NULL ){. 
23060 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72       pFd->lastEr
23070 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
23080 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
23090 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
230a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
230b0 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , pFd->lastErrno
230c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
230d0 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70           "winMap
230e0 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61  file1", pFd->zPa
230f0 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f  th);.      /* Lo
23100 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74  g the error, but
23110 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c   continue normal
23120 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67   operation using
23130 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f   xRead/xWrite */
23140 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23150 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45  "MAP-FILE-CREATE
23160 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
23170 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
23190 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
231a0 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
231b0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
231c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
231d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
231e0 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70     assert( (nMap
231f0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
23200 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a  PageSize)==0 );.
23210 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
23220 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65  of(SIZE_T)==size
23230 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  of(sqlite3_int64
23240 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66  ) || nMap<=0xfff
23250 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c  fffff );.#if SQL
23260 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
23270 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
23280 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70  wOfFileFromApp(p
23290 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
232a0 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
232b0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  );.#else.    pNe
232c0 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
232d0 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66  ile(pFd->hMap, f
232e0 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a  lags, 0, 0, (SIZ
232f0 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69  E_T)nMap);.#endi
23300 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  f.    if( pNew==
23310 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73  NULL ){.      os
23320 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d  CloseHandle(pFd-
23330 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46  >hMap);.      pF
23340 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  d->hMap = NULL;.
23350 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
23360 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
23370 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
23380 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
23390 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
233a0 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
233b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
233c0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
233d0 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50  pfile2", pFd->zP
233e0 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
233f0 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
23400 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
23410 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
23420 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
23430 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
23440 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70  ("MAP-FILE-MAP p
23450 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
23460 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
23470 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
23480 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
23490 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
234a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
234b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
234c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
234d0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
234e0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64   = pNew;.    pFd
234f0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61  ->mmapSize = nMa
23500 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  p;.  }..  OSTRAC
23510 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
23520 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
23530 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
23540 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
23550 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
23560 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65  d(), pFd));.  re
23570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23580 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
23590 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
235a0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
235b0 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
235c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
235d0 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
235e0 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
235f0 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
23600 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
23610 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
23620 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
23630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
23640 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
23650 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
23660 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
23670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
23680 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
23690 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
236a0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
236b0 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
236c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
236d0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
236e0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
236f0 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
23700 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
23710 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
23720 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
23730 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
23740 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
23750 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
23760 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
23770 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
23780 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  t eventually.** 
23790 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
237a0 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
237b0 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a   winUnfetch()..*
237c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
237d0 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
237e0 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
237f0 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
23800 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
23810 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
23820 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
23830 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
23840 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
23850 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
23860 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
23870 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  *pp = 0;..  OSTR
23880 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
23890 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
238a0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75  ffset=%lld, amou
238b0 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c  nt=%d, pp=%p\n",
238c0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
238d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
238e0 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e  d(), fd, iOff, n
238f0 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20  Amt, pp));..#if 
23900 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
23910 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
23920 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
23930 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
23940 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
23950 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
23960 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  winMapfile(pFd, 
23970 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
23980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23990 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
239a0 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
239b0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
239c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
239d0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
239e0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
239f0 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
23a00 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
23a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23a20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
23a30 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
23a40 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
23a50 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
23a60 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
23a70 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
23a80 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
23a90 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
23aa0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
23ab0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
23ac0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25  , pFile=%p, pp=%
23ad0 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51  p, *pp=%p, rc=SQ
23ae0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
23af0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
23b00 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
23b10 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20  fd, pp, *pp));. 
23b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23b30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
23b40 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
23b50 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
23b60 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23b70 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20  n releases a.** 
23b80 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
23b90 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
23ba0 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63   call to winFetc
23bb0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
23bc0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
23bd0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
23be0 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
23bf0 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
23c00 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
23c10 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
23c20 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
23c30 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
23c40 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  on..**.** Or, if
23c50 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
23c60 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
23c70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23c80 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a  is being called.
23c90 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
23ca0 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
23cb0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
23cc0 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
23cd0 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79  g mapping.** may
23ce0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
23cf0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
23d00 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
23d10 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
23d20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
23d30 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
23d40 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
23d50 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
23d60 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
23d70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
23d80 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
23d90 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
23da0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70  le */..  /* If p
23db0 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
23dc0 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
23dd0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
23de0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20  o outstanding.  
23df0 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ** xFetch refere
23e00 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d  nces. Or, if p!=
23e10 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  0 (meaning it is
23e20 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72   an xFetch refer
23e30 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  ence),.  ** then
23e40 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
23e50 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
23e60 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61  tanding.  */.  a
23e70 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28  ssert( (p==0)==(
23e80 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
23e90 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  0) );..  /* If p
23ea0 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74  !=0, it must mat
23eb0 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75  ch the iOff valu
23ec0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
23ed0 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38  p==0 || p==&((u8
23ee0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
23ef0 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20  on)[iOff] );..  
23f00 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
23f10 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
23f20 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
23f30 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  , p=%p\n",.     
23f40 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
23f50 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
23f60 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a  Fd, iOff, p));..
23f70 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
23f80 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
23f90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23fa0 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64   FIXME:  If Wind
23fb0 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73  ows truly always
23fc0 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61   prevents trunca
23fd0 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67  ting or deleting
23fe0 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77   a.    ** file w
23ff0 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69  hile a mapping i
24000 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65  s held, then the
24010 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e   following winUn
24020 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20  mapfile() call. 
24030 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73     ** is unneces
24040 73 61 72 79 20 63 61 6e 20 62 65 20 6f 6d 69 74  sary can be omit
24050 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c  ted - potentiall
24060 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20  y improving.    
24070 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  ** performance. 
24080 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   */.    winUnmap
24090 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a  file(pFd);.  }..
240a0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
240b0 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23  FetchOut>=0 );.#
240c0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
240d0 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25  (("UNFETCH pid=%
240e0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
240f0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
24100 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
24110 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
24120 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72  ), fd));.  retur
24130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24140 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
24150 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
24160 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
24170 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
24180 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
24190 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
241a0 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
241b0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
241c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
241e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
241f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24220 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  */../*.** This v
24230 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
24240 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
24250 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
24260 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
24270 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
24280 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
24290 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
242a0 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
242b0 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
242e0 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
24310 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24330 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
24340 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24360 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
24370 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
243a0 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
243d0 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243f0 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
24400 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20  /.  winLock,    
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24420 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
24430 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20    winUnlock,    
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
24460 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
24470 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
24480 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
24490 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
244a0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244c0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
244d0 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244f0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
24500 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
24510 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
24520 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
24530 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
24540 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24560 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
24570 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
245a0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
245b0 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
245c0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
245d0 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
245e0 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
245f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
24600 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46  mUnmap */.  winF
24610 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
24620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24630 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e  Fetch */.  winUn
24640 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20  fetch           
24650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
24660 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  nfetch */.};../*
24670 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20  .** This vector 
24680 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
24690 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
246a0 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a   operate on an.*
246b0 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66  * sqlite3_file f
246c0 6f 72 20 77 69 6e 33 32 20 77 69 74 68 6f 75 74  or win32 without
246d0 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e 79 20   performing any 
246e0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
246f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
24700 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
24710 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64 20 3d 20  oNolockMethod = 
24720 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  {.  3,          
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
24750 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20  */.  winClose,  
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
24780 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20  /.  winRead,    
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
247b0 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20    winWrite,     
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
247e0 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20   winTruncate,   
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
24810 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20  .  winSync,     
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
24840 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20   winFileSize,   
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24860 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
24870 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b  .  winNolockLock
24880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24890 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
248a0 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b   winNolockUnlock
248b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
248c0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
248d0 20 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52   winNolockCheckR
248e0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
248f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
24900 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46  edLock */.  winF
24910 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
24920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24930 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
24940 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20   winSectorSize, 
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24960 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
24970 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68  */.  winDeviceCh
24980 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
24990 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
249a0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
249b0 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20  /.  winShmMap,  
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
249e0 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
24a10 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
24a20 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
24a30 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
24a40 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55  ier */.  winShmU
24a50 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
24a60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
24a70 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65  Unmap */.  winFe
24a80 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
24a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
24aa0 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66  etch */.  winUnf
24ab0 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  etch            
24ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
24ad0 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 73 74 61  fetch */.};..sta
24ae0 74 69 63 20 77 69 6e 56 66 73 41 70 70 44 61 74  tic winVfsAppDat
24af0 61 20 77 69 6e 41 70 70 44 61 74 61 20 3d 20 7b  a winAppData = {
24b00 0a 20 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 2c  .  &winIoMethod,
24b10 20 20 20 20 20 20 20 2f 2a 20 70 4d 65 74 68 6f         /* pMetho
24b20 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  d */.  0,       
24b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
24b40 70 70 44 61 74 61 20 2a 2f 0a 20 20 30 20 20 20  ppData */.  0   
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b  /* bNoLock */.};
24b70 0a 0a 73 74 61 74 69 63 20 77 69 6e 56 66 73 41  ..static winVfsA
24b80 70 70 44 61 74 61 20 77 69 6e 4e 6f 6c 6f 63 6b  ppData winNolock
24b90 41 70 70 44 61 74 61 20 3d 20 7b 0a 20 20 26 77  AppData = {.  &w
24ba0 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64  inIoNolockMethod
24bb0 2c 20 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f 0a  , /* pMethod */.
24bc0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
24bd0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
24be0 61 20 2a 2f 0a 20 20 31 20 20 20 20 20 20 20 20  a */.  1        
24bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 4e             /* bN
24c00 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a  oLock */.};../**
24c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
24c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c70 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
24c80 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
24c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ca0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
24cb0 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
24cc0 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
24cd0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
24ce0 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
24cf0 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
24d00 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
24d10 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a  d(__CYGWIN__)./*
24d20 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69  .** Convert a fi
24d30 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74  lename from what
24d40 65 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79  ever the underly
24d50 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
24d60 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73  stem.** supports
24d70 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69   for filenames i
24d80 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63  nto UTF-8.  Spac
24d90 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
24da0 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69  sult is.** obtai
24db0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
24dc0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
24dd0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
24de0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
24df0 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f  atic char *winCo
24e00 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
24e10 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ame(const void *
24e20 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
24e30 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ar *zConverted =
24e40 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54   0;.  if( osIsNT
24e50 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
24e60 72 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64  rted = winUnicod
24e70 65 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d  eToUtf8(zFilenam
24e80 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
24e90 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
24ea0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
24eb0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
24ec0 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 46 69 6c  nMbcsToUtf8(zFil
24ed0 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65  ename, osAreFile
24ee0 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d  ApisANSI());.  }
24ef0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c  .#endif.  /* cal
24f00 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
24f10 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
24f20 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
24f30 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rted;.}.#endif..
24f40 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
24f50 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
24f60 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
24f70 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
24f80 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
24f90 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
24fa0 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
24fb0 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
24fc0 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
24fd0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
24fe0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
24ff0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
25000 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
25010 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43  tatic void *winC
25020 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
25030 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
25040 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
25050 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
25060 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
25070 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
25080 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66  nverted = winUtf
25090 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
250a0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
250b0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
250c0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
250d0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
250e0 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a   winUtf8ToMbcs(z
250f0 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46  Filename, osAreF
25100 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
25110 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
25120 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
25130 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
25140 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
25150 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
25160 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25170 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
25180 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
25190 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62  d UTF-8 string b
251a0 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69  uffer.** ends wi
251b0 74 68 20 61 20 64 69 72 65 63 74 6f 72 79 20 73  th a directory s
251c0 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
251d0 65 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75  er or one was su
251e0 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64  ccessfully.** ad
251f0 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ded to it..*/.st
25200 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65  atic int winMake
25210 45 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20  EndInDirSep(int 
25220 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
25230 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b  ){.  if( zBuf ){
25240 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20  .    int nLen = 
25250 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
25260 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e  zBuf);.    if( n
25270 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Len>0 ){.      i
25280 66 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a  f( winIsDirSep(z
25290 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a  Buf[nLen-1]) ){.
252a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
252b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
252c0 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b  ( nLen+1<nBuf ){
252d0 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c  .        zBuf[nL
252e0 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53  en] = winGetDirS
252f0 65 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  ep();.        zB
25300 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30  uf[nLen+1] = '\0
25310 27 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ';.        retur
25320 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
25330 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25340 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
25350 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
25360 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f  ile name and sto
25370 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  re the resulting
25380 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a   pointer into pz
25390 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  Buf..** The poin
253a0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20  ter returned in 
253b0 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66 72  pzBuf must be fr
253c0 65 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  eed via sqlite3_
253d0 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
253e0 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
253f0 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
25400 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70   *pVfs, char **p
25410 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
25420 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
25430 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
25440 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
25450 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
25460 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
25470 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
25480 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20  9";.  size_t i, 
25490 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20  j;.  int nPre = 
254a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
254b0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
254c0 5f 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20  _PREFIX);.  int 
254d0 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72  nMax, nBuf, nDir
254e0 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a  , nLen;.  char *
254f0 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zBuf;..  /* It's
25500 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
25510 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
25520 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
25530 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
25540 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
25550 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
25560 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
25570 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
25580 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
25590 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20   failing..  */. 
255a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
255b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
255c0 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41  IOERR );..  /* A
255d0 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72  llocate a tempor
255e0 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 73 74  ary buffer to st
255f0 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ore the fully qu
25600 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a  alified file.  *
25610 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74  * name for the t
25620 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
25630 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77  If this fails, w
25640 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75  e cannot continu
25650 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d  e..  */.  nMax =
25660 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
25670 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b  e; nBuf = nMax +
25680 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c   2;.  zBuf = sql
25690 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
256a0 6e 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a  nBuf );.  if( !z
256b0 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  Buf ){.    OSTRA
256c0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
256d0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
256e0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
256f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25700 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
25710 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  T;.  }..  /* Fig
25720 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65  ure out the effe
25730 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20  ctive temporary 
25740 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73  directory.  Firs
25750 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a  t, check if one.
25760 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78    ** has been ex
25770 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20  plicitly set by 
25780 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b  the application;
25790 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   otherwise, use 
257a0 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e  the one.  ** con
257b0 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f  figured by the o
257c0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e  perating system.
257d0 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e  .  */.  nDir = n
257e0 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35  Max - (nPre + 15
257f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69  );.  assert( nDi
25800 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  r>0 );.  if( sql
25810 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
25820 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ory ){.    int n
25830 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33  DirLen = sqlite3
25840 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
25850 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
25860 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65  ;.    if( nDirLe
25870 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n>0 ){.      if(
25880 20 21 77 69 6e 49 73 44 69 72 53 65 70 28 73 71   !winIsDirSep(sq
25890 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
258a0 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29  tory[nDirLen-1])
258b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72   ){.        nDir
258c0 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Len++;.      }. 
258d0 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e       if( nDirLen
258e0 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20  >nDir ){.       
258f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
25900 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  uf);.        OST
25910 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
25920 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
25930 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20  RROR\n"));.     
25940 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
25950 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
25960 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
25970 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20  mpname1", 0);.  
25980 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
25990 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
259a0 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73  x, zBuf, "%s", s
259b0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
259c0 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20  ctory);.    }.  
259d0 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  }.#if defined(__
259e0 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65  CYGWIN__).  else
259f0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
25a00 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
25a10 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20  ] = {.       0, 
25a20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54  /* getenv("SQLIT
25a30 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  E_TMPDIR") */.  
25a40 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
25a50 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20  v("TMPDIR") */. 
25a60 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
25a70 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20  nv("TMP") */.   
25a80 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
25a90 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20  ("TEMP") */.    
25aa0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
25ab0 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a  "USERPROFILE") *
25ac0 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74  /.       "/var/t
25ad0 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73  mp",.       "/us
25ae0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
25af0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e  /tmp",.       ".
25b00 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20  ",.       0     
25b10 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69     /* List termi
25b20 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a  nator */.    };.
25b30 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
25b40 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   i;.    const ch
25b50 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
25b60 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30     if( !azDirs[0
25b70 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ] ) azDirs[0] = 
25b80 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54  getenv("SQLITE_T
25b90 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28  MPDIR");.    if(
25ba0 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
25bb0 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
25bc0 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  ("TMPDIR");.    
25bd0 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29  if( !azDirs[2] )
25be0 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74   azDirs[2] = get
25bf0 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20  env("TMP");.    
25c00 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29  if( !azDirs[3] )
25c10 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74   azDirs[3] = get
25c20 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20  env("TEMP");.   
25c30 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20   if( !azDirs[4] 
25c40 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65  ) azDirs[4] = ge
25c50 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c  tenv("USERPROFIL
25c60 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  E");.    for(i=0
25c70 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
25c80 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
25c90 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
25ca0 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76  s[i++]){.      v
25cb0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
25cc0 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d  .      if( zDir=
25cd0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
25ce0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
25cf0 61 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20  ath starts with 
25d00 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66  a drive letter f
25d10 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63  ollowed by the c
25d20 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  olon.      ** ch
25d30 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20  aracter, assume 
25d40 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  it is already a 
25d50 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
25d60 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20  h; otherwise,.  
25d70 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62      ** it must b
25d80 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  e converted to a
25d90 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61   native Win32 pa
25da0 74 68 20 76 69 61 20 74 68 65 20 43 79 67 77 69  th via the Cygwi
25db0 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70  n API.      ** p
25dc0 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74  rior to using it
25dd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25de0 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c   if( winIsDriveL
25df0 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44  etterAndColon(zD
25e00 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ir) ){.        z
25e10 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
25e20 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
25e30 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20  lename(zDir);.  
25e40 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76        if( !zConv
25e50 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20  erted ){.       
25e60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25e70 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
25e80 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
25e90 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
25ea0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
25eb0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
25ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25ed0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
25ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25ef0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
25f00 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
25f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
25f20 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
25f30 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b  uf, "%s", zDir);
25f40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25f50 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25f60 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
25f70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
25f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25f90 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
25fa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25fb0 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65         zConverte
25fc0 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  d = sqlite3Mallo
25fd0 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b  cZero( nMax+1 );
25fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
25ff0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
26000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26010 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
26020 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
26030 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
26040 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
26050 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
26060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26070 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
26080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26090 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
260a0 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
260b0 20 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54            osIsNT
260c0 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
260d0 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
260e0 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44  SIX_TO_WIN_A, zD
260f0 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ir,.            
26100 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20      zConverted, 
26110 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20  nMax+1)<0 ){.   
26120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26130 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26140 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26150 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
26160 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
26170 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
26180 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
26190 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a  _CONVPATH\n"));.
261a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
261b0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
261c0 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
261d0 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
261e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26200 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
26210 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  , zDir);.       
26220 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
26230 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
26240 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
26250 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
26260 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63  t, we know the c
26270 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74 6f  andidate directo
26280 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73 68  ry exists and sh
26290 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ould.          *
262a0 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65  * be used.  Howe
262b0 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64  ver, we may need
262c0 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
262d0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
262e0 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  g.          ** i
262f0 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46  ts name into UTF
26300 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69  -8 (i.e. if it i
26310 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e  s UTF-16 right n
26320 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ow)..          *
26330 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  /.          char
26340 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
26350 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
26360 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  me(zConverted);.
26370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
26380 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
26390 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
263a0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
263b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
263c0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
263d0 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
263e0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
263f0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
26400 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
26410 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26420 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26430 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
26440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26450 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
26460 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
26470 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
26480 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26490 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
264a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
264b0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
264c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
264d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
264e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
264f0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
26500 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c   }.    }.  }.#el
26510 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
26520 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
26530 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
26540 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  se if( osIsNT() 
26550 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
26560 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20  lti;.    LPWSTR 
26570 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69  zWidePath = sqli
26580 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
26590 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  Max*sizeof(WCHAR
265a0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57  ) );.    if( !zW
265b0 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  idePath ){.     
265c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
265d0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
265e0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
265f0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
26600 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
26610 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26620 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
26630 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
26640 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
26650 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74  W(nMax, zWidePat
26660 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
26670 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
26680 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
26690 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
266a0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
266b0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
266c0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
266d0 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
266e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
266f0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
26700 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
26710 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
26720 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26740 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
26750 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
26760 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69   zMulti = winUni
26770 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
26780 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
26790 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
267a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
267b0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
267c0 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
267d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
267e0 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
267f0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
26800 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
26810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26820 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
26830 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26840 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
26850 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
26860 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
26870 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
26880 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
26890 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
268a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
268b0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
268c0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
268d0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
268e0 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68  r *zUtf8;.    ch
268f0 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20  ar *zMbcsPath = 
26900 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26910 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69  o( nMax );.    i
26920 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b  f( !zMbcsPath ){
26930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26940 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
26950 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26960 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26970 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
26980 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
26990 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
269a0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
269b0 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
269c0 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d  mpPathA(nMax, zM
269d0 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  bcsPath)==0 ){. 
269e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
269f0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
26a00 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26a10 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26a20 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
26a30 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
26a40 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
26a50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
26a60 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
26a70 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
26aa0 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20  mpname3", 0);.  
26ab0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20    }.    zUtf8 = 
26ac0 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 4d  winMbcsToUtf8(zM
26ad0 62 63 73 50 61 74 68 2c 20 6f 73 41 72 65 46 69  bcsPath, osAreFi
26ae0 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20  leApisANSI());. 
26af0 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
26b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26b10 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
26b20 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
26b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26b40 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
26b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
26b60 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
26b70 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
26b80 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
26b90 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26ba0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
26bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26bc0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
26bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26be0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
26bf0 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65  2_HAS_ANSI */.#e
26c00 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
26c10 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f  OS_WINRT */..  /
26c20 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  *.  ** Check to 
26c30 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65  make sure the te
26c40 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
26c50 79 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61  y ends with an a
26c60 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20  ppropriate.  ** 
26c70 73 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69  separator.  If i
26c80 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74  t does not and t
26c90 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75  here is not enou
26ca0 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f  gh space left to
26cb0 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66   add.  ** one, f
26cc0 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ail..  */.  if( 
26cd0 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72  !winMakeEndInDir
26ce0 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66  Sep(nDir+1, zBuf
26cf0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
26d00 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
26d10 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26d20 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26d30 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
26d40 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
26d50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
26d60 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
26d70 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20  mpname4", 0);.  
26d80 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  }..  /*.  ** Che
26d90 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
26da0 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
26db0 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
26dc0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
26dd0 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  .  ** name in th
26de0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
26df0 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  at:.  **.  **   
26e00 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  "<temporary_dire
26e10 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58  ctory>/etilqs_XX
26e20 58 58 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c  XXXXXXXXXXXXX\0\
26e30 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0".  **.  ** If 
26e40 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
26e50 54 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e  TE_ERROR.  The n
26e60 75 6d 62 65 72 20 31 37 20 69 73 20 75 73 65 64  umber 17 is used
26e70 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
26e80 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66  o.  ** account f
26e90 6f 72 20 74 68 65 20 73 70 61 63 65 20 75 73 65  or the space use
26ea0 64 20 62 79 20 74 68 65 20 31 35 20 63 68 61 72  d by the 15 char
26eb0 61 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66  acter random suf
26ec0 66 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a  fix and the.  **
26ed0 20 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55   two trailing NU
26ee0 4c 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54  L characters.  T
26ef0 68 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f  he final directo
26f00 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
26f10 72 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20  racter.  ** has 
26f20 61 6c 72 65 61 64 79 20 61 64 64 65 64 20 69 66  already added if
26f30 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65   it was not alre
26f40 61 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a  ady present..  *
26f50 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74  /.  nLen = sqlit
26f60 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
26f70 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20  ;.  if( (nLen + 
26f80 6e 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75  nPre + 17) > nBu
26f90 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  f ){.    sqlite3
26fa0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
26fb0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26fc0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26fd0 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
26fe0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
26ff0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
27000 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
27010 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20  mpname5", 0);.  
27020 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  }..  sqlite3_snp
27030 72 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c  rintf(nBuf-16-nL
27040 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53  en, zBuf+nLen, S
27050 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
27060 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20  PREFIX);..  j = 
27070 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
27080 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
27090 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
270a0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
270b0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
270c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
270d0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
270e0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
270f0 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
27100 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
27110 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
27120 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d  = 0;.  zBuf[j+1]
27130 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d   = 0;.  *pzBuf =
27140 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43   zBuf;..  OSTRAC
27150 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
27160 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  E name=%s, rc=SQ
27170 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66  LITE_OK\n", zBuf
27180 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
27190 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
271a0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
271b0 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69  the named file i
271c0 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63  s really a direc
271d0 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61  tory.  Return fa
271e0 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20  lse if.** it is 
271f0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
27200 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79  than a directory
27210 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
27220 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d   any kind of mem
27230 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ory.** allocatio
27240 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
27250 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69  atic int winIsDi
27260 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43  r(const void *zC
27270 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f  onverted){.  DWO
27280 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
27290 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
272a0 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28  astErrno;..  if(
272b0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
272c0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
272d0 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
272e0 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
272f0 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
27300 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
27310 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
27320 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
27330 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
27340 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
27350 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
27360 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
27370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27380 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
27390 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273b0 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
273c0 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72   && winRetryIoer
273d0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
273e0 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
273f0 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !rc ){.      ret
27400 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69  urn 0; /* Invali
27410 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d  d name? */.    }
27420 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74  .    attr = sAtt
27430 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
27440 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49  ibutes;.#if SQLI
27450 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
27460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72   }else{.    attr
27470 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
27480 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
27490 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
274a0 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
274b0 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46  (attr!=INVALID_F
274c0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20  ILE_ATTRIBUTES) 
274d0 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54  && (attr&FILE_AT
274e0 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
274f0 59 29 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72  Y);.}../* forwar
27500 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
27510 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63  tatic int winAcc
27520 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
27530 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
27540 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
27550 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
27560 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
27570 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
27580 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
27590 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275b0 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20  /* Type of test 
275c0 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20  to make on this 
275d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  file */.  int *p
275e0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
275f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73       /* OUT: Res
27600 75 6c 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ult */.);../*.**
27610 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f   Open a file..*/
27620 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
27630 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
27640 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
27650 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20   /* Used to get 
27660 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6c 65 6e  maximum path len
27670 67 74 68 20 61 6e 64 20 41 70 70 44 61 74 61 20  gth and AppData 
27680 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
27690 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
276a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
276b0 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
276c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
276d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
276e0 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
276f0 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
27700 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27720 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
27730 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
27740 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
27750 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
27760 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
27770 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
27780 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
27790 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
277a0 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
277b0 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
277c0 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
277d0 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
277e0 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
277f0 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
27800 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
27810 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
27820 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
27830 6e 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70  nVfsAppData *pAp
27840 70 44 61 74 61 3b 0a 20 20 77 69 6e 46 69 6c 65  pData;.  winFile
27850 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
27860 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
27870 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20  zConverted;     
27880 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
27890 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64  name in OS encod
278a0 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
278b0 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d  har *zUtf8Name =
278c0 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e   zName; /* Filen
278d0 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63  ame in UTF-8 enc
278e0 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63  oding */.  int c
278f0 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  nt = 0;..  /* If
27900 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
27910 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
27920 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
27930 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
27940 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
27950 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
27960 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
27970 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
27980 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
27990 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30  ar *zTmpname = 0
279a0 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  ; /* For tempora
279b0 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20  ry filename, if 
279c0 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20  necessary. */.. 
279d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
279e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
279f0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
27a00 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21  rn Code */.#if !
27a10 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
27a20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
27a30 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  CE.  int eType =
27a40 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
27a50 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
27a60 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
27a70 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45  endif..  int isE
27a80 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
27a90 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
27aa0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
27ab0 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
27ac0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
27ad0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
27ae0 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
27af0 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
27b00 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
27b10 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
27b20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
27b30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
27b40 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
27b50 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
27b60 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
27b70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
27b80 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  TE);..#ifndef ND
27b90 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65  EBUG.  int isOpe
27ba0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72  nJournal = (isCr
27bb0 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
27bc0 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
27bd0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
27be0 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  NAL.     || eTyp
27bf0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
27c00 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  AIN_JOURNAL.    
27c10 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27c20 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
27c30 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
27c40 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
27c50 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61  s, pFile=%p, fla
27c60 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73  gs=%x, pOutFlags
27c70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
27c80 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64     zUtf8Name, id
27c90 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
27ca0 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  gs));..  /* Chec
27cb0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
27cc0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
27cd0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
27ce0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
27cf0 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
27d00 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
27d10 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
27d20 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29  , and.  **   (b)
27d30 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
27d40 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
27d50 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
27d60 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
27d70 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
27d80 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
27d90 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
27da0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
27db0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
27dc0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
27dd0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
27de0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
27df0 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
27e00 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
27e10 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
27e20 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
27e30 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
27e40 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
27e50 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
27e60 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
27e70 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
27e80 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
27e90 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
27ea0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
27eb0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
27ec0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
27ed0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
27ee0 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20  rnal are never. 
27ef0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
27f00 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
27f10 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
27f20 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
27f30 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
27f40 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
27f50 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
27f60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
27f70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
27f80 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
27f90 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
27fa0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
27fb0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
27fc0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
27fd0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
27fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
27ff0 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
28000 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
28010 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
28020 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
28030 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
28040 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
28050 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
28060 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
28070 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
28080 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
28090 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
280a0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
280b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
280c0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20  OPEN_TEMP_DB.   
280d0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
280e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
280f0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
28100 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
28110 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20  P_JOURNAL.      
28120 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
28130 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
28140 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
28150 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
28160 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20  _JOURNAL.       
28170 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
28180 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
28190 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
281a0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
281b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
281c0 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  le!=0 );.  memse
281d0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
281e0 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20  of(winFile));.  
281f0 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
28200 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
28210 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
28220 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74  WINRT.  if( !zUt
28230 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74  f8Name && !sqlit
28240 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
28250 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
28260 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
28270 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69  R,.        "sqli
28280 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
28290 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  ry variable shou
282a0 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69  ld be set for Wi
282b0 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nRT");.  }.#endi
282c0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  f..  /* If the s
282d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
282e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
282f0 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
28300 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  e a.  ** tempora
28310 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  ry file name to 
28320 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  use.  */.  if( !
28330 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
28340 20 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74   assert( isDelet
28350 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72  e && !isOpenJour
28360 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  nal );.    rc = 
28370 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
28380 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b  Vfs, &zTmpname);
28390 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
283a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
283b0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
283c0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20  ame=%s, rc=%s", 
283d0 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74  zUtf8Name, sqlit
283e0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
283f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
28410 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
28420 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61  ;.  }..  /* Data
28430 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
28440 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
28450 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
28460 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55  y are not.  ** U
28470 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
28480 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
28490 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
284a0 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
284b0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
284c0 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  ameter()..  */. 
284d0 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21   assert( (eType!
284e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
284f0 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20  N_DB) || (flags 
28500 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
28510 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74  I) ||.       zUt
28520 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  f8Name[sqlite3St
28530 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65  rlen30(zUtf8Name
28540 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  )+1]==0 );..  /*
28550 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
28560 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
28570 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
28580 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
28590 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
285a0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
285b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
285c0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
285d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
285e0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
285f0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
28600 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
28610 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55  IOERR_NOMEM", zU
28620 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
28630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
28640 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
28650 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44   }..  if( winIsD
28660 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
28670 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
28680 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28690 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
286a0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
286b0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
286c0 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
286d0 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
286e0 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
286f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28700 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
28710 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
28720 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
28730 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
28740 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
28750 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
28760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
28770 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
28780 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
28790 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
287a0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
287b0 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
287c0 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
287d0 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74 65  e is.  ** create
287e0 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
287f0 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
28800 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
28810 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73 20  access".  ** as 
28820 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e  it is usually un
28830 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20  derstood..  */. 
28840 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
28850 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
28860 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
28870 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
28880 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
28890 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
288a0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
288b0 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
288c0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
288d0 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
288e0 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
288f0 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
28900 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e   /* Open existin
28910 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74  g file, or creat
28920 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  e if it doesn't 
28930 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43  exist */.    dwC
28940 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
28950 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
28960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
28970 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20  * Opens a file, 
28980 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74  only if it exist
28990 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
289a0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
289b0 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b  = OPEN_EXISTING;
289c0 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d  .  }..  dwShareM
289d0 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
289e0 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
289f0 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28  RE_WRITE;..  if(
28a00 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
28a10 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
28a20 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
28a30 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
28a40 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
28a50 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20  N;.    isTemp = 
28a60 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46  1;.#else.    dwF
28a70 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
28a80 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
28a90 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20  TE_TEMPORARY.   
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
28ac0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
28ad0 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEN.            
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
28b00 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
28b10 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
28b20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
28b30 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
28b40 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
28b50 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72  ;.  }.  /* Repor
28b60 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ts from the inte
28b70 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65  rnet are that pe
28b80 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77  rformance is alw
28b90 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20  ays.  ** better 
28ba0 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  if FILE_FLAG_RAN
28bb0 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73  DOM_ACCESS is us
28bc0 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39  ed.  Ticket #269
28bd0 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  9. */.#if SQLITE
28be0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c  _OS_WINCE.  dwFl
28bf0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
28c00 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
28c10 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e  NDOM_ACCESS;.#en
28c20 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  dif..  if( osIsN
28c30 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
28c40 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43  E_OS_WINRT.    C
28c50 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
28c60 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65  DED_PARAMETERS e
28c70 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
28c80 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  s;.    extendedP
28c90 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65  arameters.dwSize
28ca0 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45   = sizeof(CREATE
28cb0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
28cc0 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20  ARAMETERS);.    
28cd0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
28ce0 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  rs.dwFileAttribu
28cf0 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tes =.          
28d00 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
28d10 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54  ibutes & FILE_AT
28d20 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20  TRIBUTE_MASK;.  
28d30 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
28d40 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73  ters.dwFileFlags
28d50 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74   = dwFlagsAndAtt
28d60 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46  ributes & FILE_F
28d70 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  LAG_MASK;.    ex
28d80 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
28d90 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c  .dwSecurityQosFl
28da0 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41  ags = SECURITY_A
28db0 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78  NONYMOUS;.    ex
28dc0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
28dd0 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69  .lpSecurityAttri
28de0 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  butes = NULL;.  
28df0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
28e00 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69  ters.hTemplateFi
28e10 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  le = NULL;.    d
28e20 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43  o{.      h = osC
28e30 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
28e40 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e60 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
28e70 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
28ec0 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
28ef0 72 61 6d 65 74 65 72 73 29 3b 0a 20 20 20 20 20  rameters);.     
28f00 20 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44 5f   if( h!=INVALID_
28f10 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20 62  HANDLE_VALUE ) b
28f20 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
28f30 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
28f40 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 2c 20         int rc2, 
28f50 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20 20  isRO = 0;.      
28f60 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
28f70 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
28f80 20 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e 41        rc2 = winA
28f90 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61 6d  ccess(pVfs, zNam
28fa0 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  e, SQLITE_ACCESS
28fb0 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a 20  _READ, &isRO);. 
28fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
28fd0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
28fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
28ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
29000 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sRO ) break;.   
29010 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
29020 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
29030 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
29040 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 6f   );.#else.    do
29050 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72  {.      h = osCr
29060 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
29070 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
290a0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
290d0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
290e0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
290f0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
29100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29110 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
29120 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29140 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20          NULL);. 
29150 20 20 20 20 20 69 66 28 20 68 21 3d 49 4e 56 41       if( h!=INVA
29160 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
29170 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29180 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
29190 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
291a0 63 32 2c 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20  c2, isRO = 0;.  
291b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
291c0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
291d0 3b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  ;.        rc2 = 
291e0 77 69 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20  winAccess(pVfs, 
291f0 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43  zName, SQLITE_AC
29200 43 45 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f  CESS_READ, &isRO
29210 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
29220 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
29230 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
29240 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
29250 26 26 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b  && isRO ) break;
29260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
29270 69 6c 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65  ile( winRetryIoe
29280 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
29290 72 6e 6f 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  rno) );.#endif. 
292a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
292b0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
292c0 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 7b 0a    else{.    do{.
292d0 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72 65 61        h = osCrea
292e0 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29  teFileA((LPCSTR)
292f0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29310 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
29320 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
29340 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
29370 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
29380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29390 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
293a0 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20       NULL);.    
293d0 20 20 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44    if( h!=INVALID
293e0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20  _HANDLE_VALUE ) 
293f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
29400 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
29410 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 2c          int rc2,
29420 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20   isRO = 0;.     
29430 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
29440 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
29450 20 20 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e         rc2 = win
29460 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61  Access(pVfs, zNa
29470 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  me, SQLITE_ACCES
29480 53 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a  S_READ, &isRO);.
29490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
294a0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
294b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
294c0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  2==SQLITE_OK && 
294d0 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20  isRO ) break;.  
294e0 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
294f0 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
29500 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
29510 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) );.  }.#endif.
29520 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
29530 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20  t, __LINE__);.. 
29540 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
29550 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
29560 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63  , access=%lx, rc
29570 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
29580 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
29590 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
295a0 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
295b0 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
295c0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
295d0 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
295e0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
295f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
29600 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29610 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29620 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
29630 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
29640 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
29650 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29660 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
29670 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20  Name, id,.      
29680 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
29690 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
296a0 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   &.             
296b0 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45          ~(SQLITE
296c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
296d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
296e0 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70  TE)),.         p
296f0 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
29700 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
29710 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
29720 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
29730 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
29740 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69  TE_CANTOPEN, pFi
29750 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22  le->lastErrno, "
29760 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e  winOpen", zUtf8N
29770 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
29780 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
29790 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
297a0 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   }..  if( pOutFl
297b0 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ags ){.    if( i
297c0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
297d0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
297e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
297f0 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  DWRITE;.    }els
29800 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  e{.      *pOutFl
29810 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
29820 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
29830 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  }.  }..  OSTRACE
29840 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
29850 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
29860 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  =%lx, pOutFlags=
29870 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25  %p, *pOutFlags=%
29880 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
29890 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55  "rc=%s\n", h, zU
298a0 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  tf8Name, dwDesir
298b0 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c  edAccess, pOutFl
298c0 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f  ags, pOutFlags ?
298d0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75  .           *pOu
298e0 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d  tFlags : 0, (h==
298f0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
29900 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
29910 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 70 41   : "ok"));..  pA
29920 70 70 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73  ppData = (winVfs
29930 41 70 70 44 61 74 61 2a 29 70 56 66 73 2d 3e 70  AppData*)pVfs->p
29940 41 70 70 44 61 74 61 3b 0a 0a 23 69 66 20 53 51  AppData;..#if SQ
29950 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
29960 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  {.    if( isRead
29970 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
29980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29990 5f 44 42 0a 20 20 20 20 20 20 20 20 20 26 26 20  _DB.         && 
299a0 28 28 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c  ((pAppData==NULL
299b0 29 20 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e  ) || !pAppData->
299c0 62 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20 20 20 20  bNoLock).       
299d0 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65    && (rc = wince
299e0 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
299f0 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54  , pFile))!=SQLIT
29a00 45 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20 20 20  E_OK.    ){.    
29a10 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
29a20 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
29a30 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29a40 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
29a50 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
29a60 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
29a70 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e  ("OPEN-CE-LOCK n
29a80 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22  ame=%s, rc=%s\n"
29a90 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  , zName, sqlite3
29aa0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
29ab0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29ac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
29ad0 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
29ae0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
29af0 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
29b00 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
29b10 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
29b20 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29b30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
29b40 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
29b50 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
29b60 6f 64 20 3d 20 70 41 70 70 44 61 74 61 20 3f 20  od = pAppData ? 
29b70 70 41 70 70 44 61 74 61 2d 3e 70 4d 65 74 68 6f  pAppData->pMetho
29b80 64 20 3a 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d : &winIoMethod
29b90 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20  ;.  pFile->pVfs 
29ba0 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d  = pVfs;.  pFile-
29bb0 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73  >h = h;.  if( is
29bc0 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
29bd0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
29be0 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e   |= WINFILE_RDON
29bf0 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  LY;.  }.  if( sq
29c00 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
29c10 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  n(zName, "psow",
29c20 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
29c30 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
29c40 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
29c50 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
29c60 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  PSOW;.  }.  pFil
29c70 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
29c80 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
29c90 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
29ca0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
29cb0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46  MMAP_SIZE>0.  pF
29cc0 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
29cd0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ;.  pFile->pMapR
29ce0 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69  egion = 0;.  pFi
29cf0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
29d00 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
29d10 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
29d20 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
29d30 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  map;.#endif..  O
29d40 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
29d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29d60 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
29d70 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
29d80 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e  ** Note that Win
29d90 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
29da0 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
29db0 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
29dc0 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
29dd0 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
29de0 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
29df0 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
29e00 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
29e10 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
29e20 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
29e30 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
29e40 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
29e50 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
29e60 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
29e70 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
29e80 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
29e90 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
29ea0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
29eb0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
29ec0 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
29ed0 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
29ee0 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
29ef0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
29f00 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
29f10 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
29f20 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
29f30 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
29f40 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
29f50 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
29f60 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
29f70 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
29f80 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
29f90 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
29fa0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
29fb0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
29fc0 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
29fd0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
29fe0 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
29ff0 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
2a000 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
2a010 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
2a020 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
2a030 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
2a040 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
2a050 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74  t rc;.  DWORD at
2a060 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  tr;.  DWORD last
2a070 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
2a080 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
2a090 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a0a0 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
2a0b0 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
2a0c0 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
2a0d0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
2a0e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2a0f0 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ETE);.  OSTRACE(
2a100 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
2a110 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c  , syncDir=%d\n",
2a120 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63   zFilename, sync
2a130 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Dir));..  zConve
2a140 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
2a150 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
2a160 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
2a170 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
2a180 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
2a190 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
2a1a0 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
2a1b0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
2a1c0 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
2a1d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2a1e0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2a1f0 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
2a200 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66   ){.    do {.#if
2a210 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2a220 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  .      WIN32_FIL
2a230 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
2a240 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
2a250 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
2a260 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
2a270 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
2a280 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65    if ( osGetFile
2a290 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43  AttributesExW(zC
2a2a0 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c  onverted, GetFil
2a2b0 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
2a2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2e0 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29     &sAttrData) )
2a2f0 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
2a300 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
2a310 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
2a320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a330 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
2a340 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
2a350 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
2a360 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
2a370 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
2a380 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
2a390 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
2a3a0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
2a3b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a3c0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
2a3d0 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
2a3e0 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
2a3f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a400 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2a410 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
2a420 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2a430 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
2a440 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
2a450 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
2a460 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
2a470 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  f.      if ( att
2a480 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
2a490 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
2a4a0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
2a4b0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
2a4c0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
2a4d0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
2a4e0 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
2a4f0 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
2a500 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
2a510 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
2a520 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2a530 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2a540 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
2a550 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
2a560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a580 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2a590 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
2a5a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a5b0 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
2a5c0 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
2a5d0 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
2a5e0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2a5f0 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
2a600 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
2a610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a620 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
2a630 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eW(zConverted) )
2a640 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2a650 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
2a660 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
2a670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a680 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
2a690 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
2a6a0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
2a6b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2a6c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
2a6d0 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
2a6e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
2a6f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2a700 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
2a710 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
2a720 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
2a730 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
2a740 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
2a750 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
2a760 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2a770 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
2a780 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
2a790 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
2a7a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
2a7b0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
2a7c0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
2a7d0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
2a7e0 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
2a7f0 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
2a800 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
2a810 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
2a820 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2a830 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
2a840 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
2a850 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
2a860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a870 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2a880 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
2a890 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a8a0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
2a8b0 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
2a8c0 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
2a8d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a8e0 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
2a8f0 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
2a900 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a910 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
2a920 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
2a930 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
2a940 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a950 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
2a960 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
2a970 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2a980 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
2a990 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
2a9a0 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
2a9b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a9c0 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
2a9d0 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
2a9e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a9f0 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
2aa00 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
2aa10 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
2aa20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2aa30 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  ETE_NOENT ){.   
2aa40 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
2aa50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2aa60 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
2aa70 2c 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a  , "winDelete", z
2aa80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
2aa90 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
2aaa0 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
2aab0 5f 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  _);.  }.  sqlite
2aac0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2aad0 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
2aae0 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
2aaf0 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
2ab00 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
2ab10 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
2ab20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ab30 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
2ab40 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
2ab50 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
2ab60 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
2ab70 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
2ab80 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2ab90 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
2aba0 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
2abb0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2abc0 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
2abd0 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
2abe0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac00 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
2ac10 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
2ac20 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
2ac30 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
2ac40 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
2ac50 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
2ac60 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
2ac70 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
2ac80 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
2ac90 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
2aca0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2acb0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
2acc0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2acd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2ace0 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f  R_ACCESS; );.  O
2acf0 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
2ad00 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25  name=%s, flags=%
2ad10 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  x, pResOut=%p\n"
2ad20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
2ad30 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70  lename, flags, p
2ad40 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f  ResOut));..  zCo
2ad50 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
2ad60 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
2ad70 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
2ad80 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
2ad90 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
2ada0 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
2adb0 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
2adc0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
2add0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
2ade0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2adf0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2ae00 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
2ae10 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
2ae20 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
2ae30 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
2ae40 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
2ae50 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
2ae60 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
2ae70 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
2ae80 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
2ae90 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
2aea0 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
2aeb0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
2aee0 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
2aef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2af10 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69  AttrData)) && wi
2af20 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
2af30 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
2af40 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
2af50 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20        /* For an 
2af60 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2af70 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61  ISTS query, trea
2af80 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  t a zero-length 
2af90 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  file.      ** as
2afa0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
2afb0 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
2afc0 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61        if(    fla
2afd0 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
2afe0 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20  S_EXISTS.       
2aff0 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
2b000 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30  nFileSizeHigh==0
2b010 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
2b020 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
2b030 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eLow==0 ){.     
2b040 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
2b050 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
2b060 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
2b070 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
2b080 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
2b090 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
2b0a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2b0b0 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
2b0c0 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  cnt, __LINE__);.
2b0d0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
2b0e0 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
2b0f0 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
2b100 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
2b110 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
2b120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b130 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2b140 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b150 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
2b160 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2b170 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
2b180 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20  nAccess",.      
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b       zFilename);
2b1b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b1c0 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
2b1d0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
2b1e0 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTES;.      }.  
2b1f0 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
2b200 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b210 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
2b220 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
2b230 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
2b240 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
2b250 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
2b260 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2b270 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
2b280 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
2b290 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2b2a0 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
2b2b0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2b2c0 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
2b2d0 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
2b2e0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
2b2f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2b300 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2b310 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
2b320 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
2b330 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
2b340 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
2b350 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26           (attr &
2b360 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
2b370 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20  READONLY)==0;.  
2b380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
2b390 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
2b3a0 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
2b3b0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
2b3c0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
2b3d0 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28  = rc;.  OSTRACE(
2b3e0 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
2b3f0 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70  , pResOut=%p, *p
2b400 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51  ResOut=%d, rc=SQ
2b410 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
2b420 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
2b430 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
2b440 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
2b450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b460 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
2b470 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
2b480 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20  ified path name 
2b490 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
2b4a0 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f  ive letter.** fo
2b4b0 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f  llowed by a colo
2b4c0 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  n character..*/.
2b4d0 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
2b4e0 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
2b4f0 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  olon(.  const ch
2b500 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
2b510 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69  .  return ( sqli
2b520 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68  te3Isalpha(zPath
2b530 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74  name[0]) && zPat
2b540 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b  hname[1]==':' );
2b550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2b560 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2b570 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2b580 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
2b590 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20  used verbatim.  
2b5a0 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  If.** non-zero i
2b5b0 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  s returned from 
2b5c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
2b5d0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2b5e0 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a  ion must simply.
2b5f0 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69  ** use the provi
2b600 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65  ded path name ve
2b610 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f  rbatim -OR- reso
2b620 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75  lve it into a fu
2b630 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20  ll path name.** 
2b640 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c  using the GetFul
2b650 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20  lPathName Win32 
2b660 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66  API function (if
2b670 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
2b680 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
2b690 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
2b6a0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2b6b0 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
2b6c0 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
2b6d0 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
2b6e0 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73  with a forward s
2b6f0 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c  lash or a backsl
2b700 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65  ash, it is eithe
2b710 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55  r.  ** a legal U
2b720 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d  NC name, a volum
2b730 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  e relative path,
2b740 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
2b750 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65  path name in the
2b760 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72  .  ** "Unix" for
2b770 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20  mat on Windows. 
2b780 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73   There is no eas
2b790 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65  y way to differe
2b7a0 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
2b7b0 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77   ** the final tw
2b7c0 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f  o cases; therefo
2b7d0 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68  re, we return th
2b7e0 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76  e safer return v
2b7f0 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a  alue of TRUE.  *
2b800 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72  * so that caller
2b810 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
2b820 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75  on will simply u
2b830 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a  se it verbatim..
2b840 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
2b850 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d  sDirSep(zPathnam
2b860 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  e[0]) ){.    ret
2b870 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
2b880 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
2b890 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
2b8a0 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61   with a letter a
2b8b0 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73  nd a colon it is
2b8c0 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65   either a volume
2b8d0 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70  .  ** relative p
2b8e0 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  ath or an absolu
2b8f0 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72  te path.  Caller
2b900 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
2b910 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a  on must not.  **
2b920 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61   attempt to trea
2b930 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69  t it as a relati
2b940 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e  ve path name (i.
2b950 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73  e. they should s
2b960 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69  imply use.  ** i
2b970 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a  t verbatim)..  *
2b980 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72  /.  if ( winIsDr
2b990 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
2b9a0 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a  n(zPathname) ){.
2b9b0 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
2b9c0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2b9d0 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69  If we get to thi
2b9e0 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74  s point, the pat
2b9f0 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c  h name should al
2ba00 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62  most certainly b
2ba10 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20  e a purely.  ** 
2ba20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e  relative one (i.
2ba30 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d  e. not a UNC nam
2ba40 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c  e, not absolute,
2ba50 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20   and not volume 
2ba60 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a  relative)..  */.
2ba70 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
2ba80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
2ba90 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2baa0 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
2bab0 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
2bac0 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
2bad0 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
2bae0 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
2baf0 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
2bb00 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
2bb10 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
2bb20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
2bb30 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
2bb40 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2bb60 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2bb70 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
2bb80 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
2bb90 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2bba0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
2bbb0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
2bbc0 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
2bbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2bbe0 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
2bbf0 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
2bc00 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
2bc30 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49   */.){.#if !SQLI
2bc40 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
2bc50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2bc60 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
2bc70 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20  GWIN__).  DWORD 
2bc80 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
2bc90 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
2bca0 72 20 2a 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a  r *zOut;.#endif.
2bcb0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
2bcc0 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
2bcd0 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
2bce0 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
2bcf0 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
2bd00 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
2bd10 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
2bd20 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
2bd30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
2bd40 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
2bd50 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  & winIsDriveLett
2bd60 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61  erAndColon(zRela
2bd70 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a  tive+1) ){.    z
2bd80 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a  Relative++;.  }.
2bd90 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
2bda0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
2bdb0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2bdc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2bdd0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2bde0 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
2bdf0 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70  assert( nFull>=p
2be00 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2be10 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  );.  if ( sqlite
2be20 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
2be30 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
2be40 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
2be50 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
2be60 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
2be70 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2be80 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2be90 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
2bea0 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
2beb0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2bec0 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
2bed0 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
2bee0 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
2bef0 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
2bf00 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
2bf10 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
2bf20 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
2bf30 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
2bf40 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
2bf50 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
2bf60 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  a slash..    */.
2bf70 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
2bf80 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
2bf90 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
2bfa0 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
2bfb0 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
2bfc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2bfd0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2bfe0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
2bff0 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
2c000 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73  .            (os
2c010 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
2c020 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
2c030 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
2c040 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
2c050 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52  CCP_RELATIVE, zR
2c060 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70  elative, zOut, p
2c070 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2c080 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  1)<0 ){.      sq
2c090 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
2c0a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
2c0b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
2c0c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
2c0d0 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
2c0e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2c100 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
2c110 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2c120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
2c130 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
2c140 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
2c150 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ame(zOut);.     
2c160 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
2c170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c180 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
2c190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c1a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2c1b0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
2c1c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c1d0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2c1e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2c1f0 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
2c200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c220 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
2c230 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
2c240 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
2c250 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
2c260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c270 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
2c280 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2c290 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
2c2a0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2c2b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2c2c0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
2c2d0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
2c2e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2c2f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2c300 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
2c310 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
2c320 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
2c330 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
2c340 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
2c350 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20  SIX_TO_WIN_A),. 
2c360 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61             zRela
2c370 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73  tive, zOut, pVfs
2c380 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c  ->mxPathname+1)<
2c390 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2c3a0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2c3b0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2c3c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2c3d0 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
2c3e0 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c400 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
2c410 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65  lPathname2", zRe
2c420 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c  lative);.    }el
2c430 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
2c440 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
2c450 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
2c460 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (zOut);.      if
2c470 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
2c480 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c490 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
2c4a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2c4b0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2c4c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2c4d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2c4e0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2c4f0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2c500 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  ll, "%s", zUtf8)
2c510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c520 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
2c530 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c540 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zOut);.    }.  }
2c550 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c560 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
2c570 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   (SQLITE_OS_WINC
2c580 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
2c590 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65  INRT) && !define
2c5a0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2c5b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2c5c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2c5d0 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e  RROR );.  /* Win
2c5e0 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
2c5f0 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
2c600 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
2c610 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
2c620 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20  /* WinRT has no 
2c630 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  way to convert a
2c640 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74   relative path t
2c650 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e  o an absolute on
2c660 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c  e. */.  if ( sql
2c670 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
2c680 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
2c690 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
2c6a0 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
2c6b0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
2c6c0 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
2c6d0 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
2c6e0 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
2c6f0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
2c700 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
2c710 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
2c720 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
2c730 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
2c740 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
2c750 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
2c760 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
2c770 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
2c780 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
2c790 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
2c7a0 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
2c7b0 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
2c7c0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2c7d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
2c7e0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
2c7f0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
2c800 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c820 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
2c830 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
2c840 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rSep(), zRelativ
2c850 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2c860 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c870 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2c880 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2c890 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
2c8a0 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72  lative);.  }.  r
2c8b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c8c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
2c8d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2c8e0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2c8f0 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
2c900 43 59 47 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49  CYGWIN__).  /* I
2c910 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2c920 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2c930 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2c940 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2c950 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2c960 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2c970 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2c980 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2c990 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2c9a0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
2c9b0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
2c9c0 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
2c9d0 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
2c9e0 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
2c9f0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2ca00 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
2ca10 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
2ca20 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2ca30 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
2ca40 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
2ca50 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
2ca60 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
2ca70 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
2ca80 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2ca90 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
2caa0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
2cab0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
2cac0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
2cad0 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
2cae0 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
2caf0 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
2cb00 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
2cb10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
2cb20 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
2cb30 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
2cb40 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
2cb50 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
2cb60 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
2cb70 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
2cb80 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
2cb90 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
2cba0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2cbb0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2cbc0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2cbd0 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
2cbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cbf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
2cc00 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
2cc10 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52  nGetDirSep(), zR
2cc20 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65  elative);.    re
2cc30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cc40 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64    }.  zConverted
2cc50 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2cc60 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  mUtf8Filename(zR
2cc70 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
2cc80 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
2cc90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cca0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2ccb0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  KPT;.  }.  if( o
2ccc0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c  sIsNT() ){.    L
2ccd0 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
2cce0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
2ccf0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
2cd00 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
2cd10 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
2cd20 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2cd30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2cd40 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2cd50 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2cd60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2cd70 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
2cd80 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
2cd90 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
2cdb0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c  nFullPathname1",
2cdc0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2cdd0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
2cde0 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
2cdf0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2ce00 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
2ce10 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
2ce20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
2ce30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ce40 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2ce50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ce60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2ce70 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2ce80 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
2ce90 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
2cea0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2ceb0 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
2cec0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
2ced0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2cee0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2cef0 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
2cf00 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
2cf10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
2cf20 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
2cf30 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
2cf40 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
2cf50 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2cf70 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
2cf80 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
2cf90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2cfa0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2cfb0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  );.    zOut = wi
2cfc0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
2cfd0 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
2cfe0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2cff0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2d000 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
2d010 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
2d020 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
2d030 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2d040 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
2d050 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
2d060 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
2d070 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
2d080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2d090 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2d0a0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2d0b0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2d0c0 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2d0d0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0f0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2d100 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c  Pathname3", zRel
2d110 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2d120 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
2d130 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
2d140 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
2d150 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
2d160 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
2d170 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
2d180 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2d190 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2d1a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2d1b0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2d1c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
2d1d0 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
2d1e0 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
2d1f0 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
2d200 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
2d210 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2d220 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2d230 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2d240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2d250 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
2d260 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2d270 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2d280 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2d290 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2b0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2d2c0 50 61 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c  Pathname4", zRel
2d2d0 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2d2e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d2f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2d300 7a 4f 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f  zOut = winMbcsTo
2d310 55 74 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72  Utf8(zTemp, osAr
2d320 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29  eFileApisANSI())
2d330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2d340 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
2d350 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74  endif.  if( zOut
2d360 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2d370 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
2d380 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
2d390 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
2d3a0 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73  s", zOut);.    s
2d3b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2d3c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2d3d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2d3e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d3f0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2d400 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
2d410 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2d420 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2d430 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
2d440 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
2d450 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
2d460 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
2d470 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
2d480 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
2d490 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
2d4a0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
2d4b0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
2d4c0 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
2d4d0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
2d4e0 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
2d4f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
2d500 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65  HANDLE h;.#if de
2d510 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
2d520 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20  ).  int nFull = 
2d530 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2d540 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  +1;.  char *zFul
2d550 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
2d560 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a  cZero( nFull );.
2d570 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
2d580 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ed = 0;.  if( zF
2d590 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ull==0 ){.    OS
2d5a0 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2d5b0 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2d5c0 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2d5d0 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
2d5e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2d5f0 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68   if( winFullPath
2d600 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2d610 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75  name, nFull, zFu
2d620 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ll)!=SQLITE_OK )
2d630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2d640 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f  ee(zFull);.    O
2d650 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2d660 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2d670 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2d680 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
2d690 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2d6a0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
2d6b0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
2d6c0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29  8Filename(zFull)
2d6d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2d6e0 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20  (zFull);.#else. 
2d6f0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
2d700 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
2d710 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
2d720 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
2d730 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2d740 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  fs);.#endif.  if
2d750 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
2d760 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
2d770 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
2d780 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
2d790 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
2d7a0 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
2d7b0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
2d7c0 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
2d7d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2d7e0 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
2d7f0 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
2d800 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
2d810 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
2d820 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
2d830 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
2d840 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
2d850 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2d860 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
2d870 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
2d880 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
2d890 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
2d8a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2d8b0 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
2d8c0 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
2d8d0 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
2d8e0 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20  e, (void*)h));. 
2d8f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2d900 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
2d910 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
2d920 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
2d930 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
2d940 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2d950 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
2d960 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2d970 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2d980 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
2d990 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
2d9a0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
2d9b0 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
2d9c0 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
2d9d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2d9e0 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
2d9f0 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
2da00 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f  ){.  FARPROC pro
2da10 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
2da20 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70  METER(pVfs);.  p
2da30 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41  roc = osGetProcA
2da40 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
2da50 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54  pH, zSym);.  OST
2da60 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e  RACE(("DLSYM han
2da70 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25  dle=%p, symbol=%
2da80 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22  s, address=%p\n"
2da90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
2daa0 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76  id*)pH, zSym, (v
2dab0 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72  oid*)proc));.  r
2dac0 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
2dad0 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61  oid))proc;.}.sta
2dae0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
2daf0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
2db00 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
2db10 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
2db20 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2db30 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
2db40 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
2db50 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
2db60 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70  LCLOSE handle=%p
2db70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e  \n", (void*)pHan
2db80 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  dle));.}.#else /
2db90 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
2dba0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
2dbb0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
2dbc0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
2dbd0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
2dbe0 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
2dbf0 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
2dc00 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
2dc10 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
2dc20 66 0a 0a 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f  f../* State info
2dc30 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
2dc40 72 61 6e 64 6f 6d 6e 65 73 73 20 67 61 74 68 65  randomness gathe
2dc50 72 65 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20  rer. */.typedef 
2dc60 73 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61  struct EntropyGa
2dc70 74 68 65 72 65 72 20 45 6e 74 72 6f 70 79 47 61  therer EntropyGa
2dc80 74 68 65 72 65 72 3b 0a 73 74 72 75 63 74 20 45  therer;.struct E
2dc90 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 7b  ntropyGatherer {
2dca0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2dcb0 20 2a 61 3b 20 20 20 2f 2a 20 47 61 74 68 65 72   *a;   /* Gather
2dcc0 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 74 68   entropy into th
2dcd0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
2dce0 6e 74 20 6e 61 3b 20 20 20 20 20 20 20 20 20 20  nt na;          
2dcf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b     /* Size of a[
2dd00 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
2dd10 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2dd20 20 20 20 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20      /* XOR next 
2dd30 69 6e 70 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20  input into a[i] 
2dd40 2a 2f 0a 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20  */.  int nXor;  
2dd50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2dd60 65 72 20 6f 66 20 58 4f 52 20 6f 70 65 72 61 74  er of XOR operat
2dd70 69 6f 6e 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a  ions done */.};.
2dd80 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2dd90 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64  LITE_TEST) && !d
2dda0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2ddb0 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f  IT_RANDOMNESS)./
2ddc0 2a 20 4d 69 78 20 73 7a 20 62 79 74 65 73 20 6f  * Mix sz bytes o
2ddd0 66 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70  f entropy into p
2dde0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
2ddf0 20 78 6f 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f   xorMemory(Entro
2de00 70 79 47 61 74 68 65 72 65 72 20 2a 70 2c 20 75  pyGatherer *p, u
2de10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 2c  nsigned char *x,
2de20 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20   int sz){.  int 
2de30 6a 2c 20 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c  j, k;.  for(j=0,
2de40 20 6b 3d 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a   k=p->i; j<sz; j
2de50 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b  ++){.    p->a[k+
2de60 2b 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20  +] ^= x[j];.    
2de70 69 66 28 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b  if( k>=p->na ) k
2de80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69   = 0;.  }.  p->i
2de90 20 3d 20 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20   = k;.  p->nXor 
2dea0 2b 3d 20 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  += sz;.}.#endif 
2deb0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
2dec0 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66  TE_TEST) && !def
2ded0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2dee0 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a  _RANDOMNESS) */.
2def0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20  ./*.** Write up 
2df00 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  to nBuf bytes of
2df10 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f   randomness into
2df20 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
2df30 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65   int winRandomne
2df40 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
2df50 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2df60 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66  char *zBuf){.#if
2df70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2df80 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
2df90 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
2dfa0 44 4f 4d 4e 45 53 53 29 0a 20 20 55 4e 55 53 45  DOMNESS).  UNUSE
2dfb0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2dfc0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  );.  memset(zBuf
2dfd0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65  , 0, nBuf);.  re
2dfe0 74 75 72 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65  turn nBuf;.#else
2dff0 0a 20 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  .  EntropyGather
2e000 65 72 20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50  er e;.  UNUSED_P
2e010 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2e020 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
2e030 2c 20 6e 42 75 66 29 3b 0a 20 20 65 2e 61 20 3d  , nBuf);.  e.a =
2e040 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2e050 29 7a 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20  )zBuf;.  e.na = 
2e060 6e 42 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d  nBuf;.  e.nXor =
2e070 20 30 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20   0;.  e.i = 0;. 
2e080 20 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d   {.    SYSTEMTIM
2e090 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79  E x;.    osGetSy
2e0a0 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
2e0b0 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2e0c0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2e0d0 26 78 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45  &x, sizeof(SYSTE
2e0e0 4d 54 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b  MTIME));.  }.  {
2e0f0 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
2e100 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
2e110 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f  cessId();.    xo
2e120 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2e130 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64  igned char*)&pid
2e140 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  , sizeof(DWORD))
2e150 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
2e160 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20  _OS_WINRT.  {.  
2e170 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20    ULONGLONG cnt 
2e180 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
2e190 36 34 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  64();.    xorMem
2e1a0 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2e1b0 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69  d char*)&cnt, si
2e1c0 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29  zeof(ULONGLONG))
2e1d0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  ;.  }.#else.  {.
2e1e0 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
2e1f0 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
2e200 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2e210 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2e220 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66  ar*)&cnt, sizeof
2e230 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65  (DWORD));.  }.#e
2e240 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2e250 53 5f 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20  S_WINRT */.  {. 
2e260 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
2e270 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
2e280 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
2e290 72 28 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65  r(&i);.    xorMe
2e2a0 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e  mory(&e, (unsign
2e2b0 65 64 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a  ed char*)&i, siz
2e2c0 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
2e2d0 52 29 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51  R));.  }.#if !SQ
2e2e0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2e2f0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2e300 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
2e310 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20  2_USE_UUID.  {. 
2e320 20 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20     UUID id;.    
2e330 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73  memset(&id, 0, s
2e340 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2e350 20 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26    osUuidCreate(&
2e360 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  id);.    xorMemo
2e370 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2e380 20 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65   char*)&id, size
2e390 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d  of(UUID));.    m
2e3a0 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69  emset(&id, 0, si
2e3b0 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20  zeof(UUID));.   
2e3c0 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
2e3d0 75 65 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20  uential(&id);.  
2e3e0 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2e3f0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2e400 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  &id, sizeof(UUID
2e410 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ));.  }.#endif /
2e420 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  * !SQLITE_OS_WIN
2e430 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
2e440 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
2e450 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20  _WIN32_USE_UUID 
2e460 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58  */.  return e.nX
2e470 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a  or>nBuf ? nBuf :
2e480 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20   e.nXor;.#endif 
2e490 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
2e4a0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
2e4b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2e4c0 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a  ANDOMNESS) */.}.
2e4d0 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
2e4e0 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
2e4f0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
2e500 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
2e510 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
2e520 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
2e530 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2e540 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
2e550 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
2e560 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
2e570 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
2e580 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2e590 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
2e5a0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
2e5b0 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
2e5c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2e5d0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2e5e0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2e5f0 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2e600 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2e610 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2e620 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2e630 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2e640 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2e650 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2e660 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2e670 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2e680 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2e690 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2e6a0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2e6b0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2e6c0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2e6d0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2e6e0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2e6f0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2e700 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2e710 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2e720 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2e730 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2e740 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2e750 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2e760 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2e770 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2e780 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2e790 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2e7a0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2e7b0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2e7c0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2e7d0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2e7e0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2e7f0 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2e800 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2e810 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2e820 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2e830 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2e840 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2e850 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2e860 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2e870 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a  e time and date.
2e880 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
2e890 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2e8a0 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2e8b0 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
2e8c0 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
2e8d0 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2e8e0 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
2e8f0 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
2e900 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
2e910 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
2e920 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61  r of.     100-na
2e930 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
2e940 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
2e950 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
2e960 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a  305813.5)..  */.
2e970 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
2e980 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2e990 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
2e9a0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
2e9b0 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
2e9c0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2e9d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2e9e0 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
2e9f0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2ea00 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
2ea10 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
2ea20 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
2ea30 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
2ea40 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
2ea50 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
2ea60 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
2ea70 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2ea80 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
2ea90 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71  alue =.      (sq
2eaa0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2eab0 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
2eac0 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
2ead0 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
2eae0 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
2eaf0 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
2eb00 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
2eb10 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
2eb20 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2eb30 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
2eb40 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2eb50 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
2eb60 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
2eb70 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
2eb80 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
2eb90 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
2eba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2ebb0 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
2ebc0 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2ebd0 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
2ebe0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
2ebf0 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
2ec00 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
2ec10 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
2ec20 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
2ec30 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
2ec40 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20  itValue) +.     
2ec50 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2ec60 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
2ec70 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
2ec80 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
2ec90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2eca0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2ecb0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2ecc0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2ecd0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2ece0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2ecf0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2ed00 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2ed10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ed20 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2ed30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ed40 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2ed50 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2ed60 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2ed70 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2ed80 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
2ed90 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2eda0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2edb0 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
2edc0 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
2edd0 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2ede0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2edf0 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2ee00 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2ee10 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2ee20 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2ee30 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
2ee40 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
2ee50 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2ee60 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
2ee70 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
2ee80 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
2ee90 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
2eea0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2eeb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2eec0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2eed0 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
2eee0 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
2eef0 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
2ef00 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
2ef10 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
2ef20 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
2ef30 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
2ef40 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
2ef50 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
2ef60 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
2ef70 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
2ef80 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
2ef90 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2efa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
2efb0 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
2efc0 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
2efd0 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
2efe0 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
2eff0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
2f000 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
2f010 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2f020 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
2f030 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
2f040 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
2f050 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
2f060 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
2f070 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
2f080 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
2f090 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2f0a0 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
2f0b0 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
2f0c0 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
2f0d0 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
2f0e0 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
2f0f0 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
2f100 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
2f110 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
2f120 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
2f130 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
2f140 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
2f150 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
2f160 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
2f170 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
2f180 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
2f190 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
2f1a0 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
2f1b0 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
2f1c0 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
2f1d0 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
2f1e0 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
2f1f0 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
2f200 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
2f210 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
2f220 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
2f230 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
2f240 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
2f250 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
2f260 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
2f270 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
2f280 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
2f290 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
2f2a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2f2b0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2f2c0 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
2f2d0 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
2f2e0 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
2f2f0 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
2f300 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
2f310 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2f320 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
2f330 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
2f340 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
2f350 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
2f360 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
2f370 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2f380 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
2f390 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
2f3a0 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
2f3b0 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
2f3c0 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
2f3d0 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
2f3e0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2f3f0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2f400 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2f410 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
2f420 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55  LastError();.  U
2f430 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f440 70 56 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75  pVfs);.  if( nBu
2f450 66 3e 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74  f>0 ) winGetLast
2f460 45 72 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66  ErrorMsg(e, nBuf
2f470 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72  , zBuf);.  retur
2f480 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n e;.}../*.** In
2f490 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
2f4a0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
2f4b0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
2f4c0 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
2f4d0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
2f4e0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2f4f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2f500 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f520 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2f530 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
2f540 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20  File),       /* 
2f550 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
2f560 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
2f570 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
2f580 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
2f590 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2f5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2f5b0 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
2f5c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f5d0 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2f5e0 26 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20  &winAppData,    
2f5f0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2f600 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2f610 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2f620 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2f630 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2f640 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
2f650 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
2f660 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
2f670 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
2f680 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
2f690 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75  me,       /* xFu
2f6a0 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
2f6b0 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
2f6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
2f6d0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
2f6e0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
2f6f0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2f700 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2f710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2f720 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2f730 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2f740 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2f750 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2f760 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  ness,         /*
2f770 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2f780 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2f790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2f7a0 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
2f7b0 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
2f7c0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2f7d0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
2f7e0 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
2f7f0 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
2f800 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
2f810 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20  entTimeInt64,   
2f820 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
2f830 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
2f840 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2f850 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2f860 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2f870 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2f880 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2f890 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2f8a0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2f8b0 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2f8c0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69  mCall */.  };.#i
2f8d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2f8e0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2f8f0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2f900 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74  3_vfs winLongPat
2f910 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  hVfs = {.    3, 
2f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f930 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2f940 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2f950 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a  nFile),       /*
2f960 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2f970 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
2f980 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2f990 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2f9a0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2f9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2f9c0 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2f9d0 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 20  -longpath",     
2f9e0 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
2f9f0 20 26 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20   &winAppData,   
2fa00 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2fa10 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2fa20 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2fa30 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2fa40 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2fa50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2fa60 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2fa70 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2fa80 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2fa90 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2faa0 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46  ame,       /* xF
2fab0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2fac0 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2fad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2fae0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2faf0 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2fb00 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2fb10 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb30 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
2fb40 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
2fb50 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2fb60 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2fb70 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  mness,         /
2fb80 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2fb90 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2fba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2fbb0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2fbc0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2fbd0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2fbe0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2fbf0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2fc00 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2fc10 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2fc20 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20  rentTimeInt64,  
2fc30 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2fc40 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2fc50 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2fc60 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2fc70 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2fc80 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2fc90 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
2fca0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2fcb0 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
2fcc0 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
2fcd0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2fce0 65 6e 64 69 66 0a 20 20 73 74 61 74 69 63 20 73  endif.  static s
2fcf0 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4e 6f  qlite3_vfs winNo
2fd00 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20  lockVfs = {.    
2fd10 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2fd20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2fd30 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2fd40 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20  (winFile),      
2fd50 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2fd60 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
2fd70 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2fd80 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2fd90 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fdb0 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2fdc0 6e 33 32 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 20  n32-none",      
2fdd0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2fde0 20 20 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70      &winNolockAp
2fdf0 70 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 70 41  pData,     /* pA
2fe00 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
2fe10 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
2fe20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2fe30 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2fe50 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2fe60 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2fe70 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2fe80 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2fe90 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  thname,       /*
2fea0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2feb0 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fed0 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2fee0 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2fef0 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2ff00 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2ff10 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
2ff20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2ff30 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2ff40 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
2ff50 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
2ff60 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
2ff70 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2ff80 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2ff90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ffa0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2ffb0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2ffc0 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65         /* xCurre
2ffd0 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2ffe0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2fff0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
30000 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
30010 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
30020 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  ,   /* xCurrentT
30030 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
30040 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
30050 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ,      /* xSetSy
30060 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
30070 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
30080 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ,      /* xGetSy
30090 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
300a0 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
300b0 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53  l,     /* xNextS
300c0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
300d0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
300e0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
300f0 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71  IDE).  static sq
30100 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e  lite3_vfs winLon
30110 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 20 3d  gPathNolockVfs =
30120 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
30130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30140 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
30150 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
30160 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  ,       /* szOsF
30170 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
30180 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
30190 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
301a0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
301b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301c0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
301d0 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70      "win32-longp
301e0 61 74 68 2d 6e 6f 6e 65 22 2c 20 2f 2a 20 7a 4e  ath-none", /* zN
301f0 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e  ame */.    &winN
30200 6f 6c 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20  olockAppData,   
30210 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
30220 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
30230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
30240 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
30250 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
30260 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
30270 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
30280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
30290 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
302a0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
302b0 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
302c0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
302d0 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
302e0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
302f0 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
30300 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30310 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
30320 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
30330 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
30340 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
30350 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
30360 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
30370 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
30380 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
30390 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
303a0 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
303b0 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
303c0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
303d0 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  tTime,        /*
303e0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
303f0 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
30400 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78  rror,       /* x
30410 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
30420 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
30430 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43  meInt64,   /* xC
30440 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
30450 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
30460 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
30470 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
30480 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
30490 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
304a0 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
304b0 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
304c0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a  stemCall,     /*
304d0 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
304e0 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a   */.  };.#endif.
304f0 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
30500 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
30510 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
30520 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
30530 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
30540 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
30550 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
30560 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
30570 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
30580 6c 29 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20  l)==80 );..  /* 
30590 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61  get memory map a
305a0 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c  llocation granul
305b0 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  arity */.  memse
305c0 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30  t(&winSysInfo, 0
305d0 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f  , sizeof(SYSTEM_
305e0 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49  INFO));.#if SQLI
305f0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73  TE_OS_WINRT.  os
30600 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
30610 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
30620 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  ;.#else.  osGetS
30630 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
30640 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  sInfo);.#endif. 
30650 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
30660 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
30670 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b  Granularity>0 );
30680 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
30690 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
306a0 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >0 );..  sqlite3
306b0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
306c0 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20  inVfs, 1);..#if 
306d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
306e0 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
306f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
30700 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61  ister(&winLongPa
30710 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69  thVfs, 0);.#endi
30720 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  f..  sqlite3_vfs
30730 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4e 6f  _register(&winNo
30740 6c 6f 63 6b 56 66 73 2c 20 30 29 3b 0a 0a 23 69  lockVfs, 0);..#i
30750 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
30760 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
30770 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
30780 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67  egister(&winLong
30790 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30  PathNolockVfs, 0
307a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
307b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
307c0 41 4c 0a 20 20 77 69 6e 42 69 67 4c 6f 63 6b 20  AL.  winBigLock 
307d0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
307e0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
307f0 5f 53 54 41 54 49 43 5f 56 46 53 31 29 3b 0a 23  _STATIC_VFS1);.#
30800 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
30810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
30820 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
30830 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49  (void){.#if SQLI
30840 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
30850 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
30860 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
30870 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b  andle(sleepObj);
30880 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
30890 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  NULL;.  }.#endif
308a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
308b0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 42  _OMIT_WAL.  winB
308c0 69 67 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  igLock = 0;.#end
308d0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
308e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
308f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
30900 49 4e 20 2a 2f 0a                                IN */.