/ Hex Artifact Content
Login

Artifact 340cb5909334c4ba748987dff2510498e3885bb24c2d9c7632794ed31279f0b5:


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 69 6e 74 20 62 50 65 72 73 69 73 74      int bPersist
1b830 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a   = *(int*)pArg;.
1b840 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69        if( bPersi
1b850 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st<0 ){.        
1b860 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1b870 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c  ile->bPersistWal
1b880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b890 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 62 50         pFile->bP
1b8a0 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50 65 72  ersistWal = bPer
1b8b0 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20 20 7d  sist!=0;.      }
1b8c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b8d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b8e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b8f0 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
1b900 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
1b910 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
1b920 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1b930 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1b940 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b950 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1b960 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1b970 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1b980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b9a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1b9b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1b9c0 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
1b9d0 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
1b9e0 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
1b9f0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
1ba00 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1ba10 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1ba20 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1ba30 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ba40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ba50 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ba60 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
1ba70 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
1ba80 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1ba90 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
1baa0 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
1bab0 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
1bac0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1bad0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1bae0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1baf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bb00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1bb10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1bb20 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
1bb30 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY: {.      int 
1bb40 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  *a = (int*)pArg;
1bb50 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e  .      if( a[0]>
1bb60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
1bb70 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
1bb80 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
1bb90 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
1bba0 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20  inIoerrRetry;.  
1bbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bbc0 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20  a[1]>0 ){.      
1bbd0 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44    winIoerrRetryD
1bbe0 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20  elay = a[1];.   
1bbf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bc00 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72    a[1] = winIoer
1bc10 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20  rRetryDelay;.   
1bc20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1bc30 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1bc40 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1bc50 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1bc60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1bc70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1bc80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1bc90 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48  CNTL_WIN32_GET_H
1bca0 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c  ANDLE: {.      L
1bcb0 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d  PHANDLE phFile =
1bcc0 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b   (LPHANDLE)pArg;
1bcd0 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d  .      *phFile =
1bce0 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20   pFile->h;.     
1bcf0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1bd00 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1bd10 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1bd20 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1bd30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bd40 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1bd50 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65  TE_TEST.    case
1bd60 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
1bd70 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20  N32_SET_HANDLE: 
1bd80 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45  {.      LPHANDLE
1bd90 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e   phFile = (LPHAN
1bda0 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20  DLE)pArg;.      
1bdb0 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20  HANDLE hOldFile 
1bdc0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
1bdd0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68    pFile->h = *ph
1bde0 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46  File;.      *phF
1bdf0 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a  ile = hOldFile;.
1be00 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1be10 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70  FCNTL oldFile=%p
1be20 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63  , newFile=%p, rc
1be30 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4f                hO
1be50 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  ldFile, pFile->h
1be60 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1be70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1be80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1be90 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1bea0 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1beb0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1bec0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
1bed0 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
1bee0 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
1bef0 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
1bf00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
1bf20 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
1bf30 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
1bf40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1bf50 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1bf60 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
1bf70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1bf80 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1bf90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
1bfa0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1bfb0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1bfc0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1bfd0 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1bfe0 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1bff0 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1c000 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1c010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1c020 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1c030 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c040 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1c050 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1c060 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1c070 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1c080 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ..      /* The v
1c090 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74  alue of newLimit
1c0a0 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c   may be eventual
1c0b0 6c 79 20 63 61 73 74 20 74 6f 20 28 53 49 5a 45  ly cast to (SIZE
1c0c0 5f 54 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20  _T) and passed. 
1c0d0 20 20 20 20 20 2a 2a 20 74 6f 20 4d 61 70 56 69       ** to MapVi
1c0e0 65 77 4f 66 46 69 6c 65 28 29 2e 20 52 65 73 74  ewOfFile(). Rest
1c0f0 72 69 63 74 20 69 74 73 20 76 61 6c 75 65 20 74  rict its value t
1c100 6f 20 32 47 42 20 69 66 20 28 53 49 5a 45 5f 54  o 2GB if (SIZE_T
1c110 29 20 69 73 20 6e 6f 74 20 61 74 0a 20 20 20 20  ) is not at.    
1c120 20 20 2a 2a 20 6c 65 61 73 74 20 61 20 36 34 2d    ** least a 64-
1c130 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  bit type. */.   
1c140 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1c150 30 20 26 26 20 73 69 7a 65 6f 66 28 53 49 5a 45  0 && sizeof(SIZE
1c160 5f 54 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20  _T)<8 ){.       
1c170 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77   newLimit = (new
1c180 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46 46 46  Limit & 0x7FFFFF
1c190 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  FF);.      }..  
1c1a0 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
1c1b0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1c1c0 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
1c1d0 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
1c1e0 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
1c1f0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
1c200 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
1c210 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1c220 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1c230 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
1c240 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
1c250 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1c260 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70          winUnmap
1c270 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
1c280 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d         rc = winM
1c290 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
1c2a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c2b0 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1c2c0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1c2d0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
1c2e0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
1c2f0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1c300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1c320 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1c330 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1c340 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22  LITE_NOTFOUND\n"
1c350 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1c360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1c370 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1c380 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1c390 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1c3a0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1c3b0 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1c3c0 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1c3d0 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1c3e0 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1c3f0 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1c400 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1c410 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1c420 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1c430 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1c440 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1c450 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1c460 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1c470 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1c480 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1c490 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1c4a0 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1c4b0 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1c4c0 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1c4d0 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1c4e0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1c4f0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1c500 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
1c510 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
1c520 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1c530 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69   *id){.  (void)i
1c540 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1c550 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1c560 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
1c570 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72   Return a vector
1c580 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61   of device chara
1c590 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73  cteristics..*/.s
1c5a0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76  tatic int winDev
1c5b0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1c5c0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1c5d0 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  *id){.  winFile 
1c5e0 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  *p = (winFile*)i
1c5f0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1c600 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
1c610 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c  ABLE_WHEN_OPEN |
1c620 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63  .         ((p->c
1c630 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
1c640 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f  LE_PSOW)?SQLITE_
1c650 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1c660 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a  OVERWRITE:0);.}.
1c670 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  ./*.** Windows w
1c680 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
1c690 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
1c6a0 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
1c6b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
1c6c0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
1c6d0 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
1c6e0 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
1c6f0 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
1c700 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
1c710 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
1c720 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
1c730 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e  static SYSTEM_IN
1c740 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
1c750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c760 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
1c770 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
1c780 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
1c790 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
1c7a0 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
1c7b0 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
1c7c0 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
1c7d0 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
1c7e0 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
1c7f0 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20  y.** this file, 
1c800 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
1c810 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
1c820 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
1c830 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
1c840 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1c850 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
1c860 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
1c870 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73  obal mutex.** is
1c880 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
1c890 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
1c8a0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
1c8b0 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1c8c0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
1c8d0 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
1c8e0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1c8f0 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
1c900 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
1c910 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
1c920 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
1c930 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1c940 5f 6d 75 74 65 78 20 2a 77 69 6e 42 69 67 4c 6f  _mutex *winBigLo
1c950 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76  ck = 0;.static v
1c960 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  oid winShmEnterM
1c970 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
1c980 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c990 72 28 77 69 6e 42 69 67 4c 6f 63 6b 29 3b 0a 7d  r(winBigLock);.}
1c9a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1c9b0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
1c9c0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
1c9d0 75 74 65 78 5f 6c 65 61 76 65 28 77 69 6e 42 69  utex_leave(winBi
1c9e0 67 4c 6f 63 6b 29 3b 0a 7d 0a 23 69 66 6e 64 65  gLock);.}.#ifnde
1c9f0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
1ca00 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
1ca10 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
1ca20 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1ca30 65 78 5f 68 65 6c 64 28 77 69 6e 42 69 67 4c 6f  ex_held(winBigLo
1ca40 63 6b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ck);.}.#endif../
1ca50 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
1ca60 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
1ca70 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
1ca80 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
1ca90 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
1caa0 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
1cab0 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
1cac0 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
1cad0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
1cae0 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
1caf0 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
1cb00 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
1cb10 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
1cb20 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
1cb30 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
1cb40 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
1cb50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
1cb60 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
1cb70 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
1cb80 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
1cb90 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
1cba0 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1cbb0 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
1cbc0 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
1cbd0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
1cbe0 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
1cbf0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1cc00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1cc10 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
1cc20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
1cc30 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  xt.**.** The fol
1cc40 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
1cc50 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
1cc60 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
1cc70 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
1cc80 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
1cc90 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
1cca0 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64  Either winShmNod
1ccb0 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
1ccc0 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f  held or winShmNo
1ccd0 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
1cce0 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
1ccf0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
1cd00 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1cd10 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
1cd20 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
1cd30 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a  tructure..**.*/.
1cd40 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1cd50 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e {.  sqlite3_mu
1cd60 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
1cd70 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
1cd80 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
1cd90 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
1cda0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1cdb0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1cdc0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ile */.  winFile
1cdd0 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20   hFile;         
1cde0 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
1cdf0 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20  le from winOpen 
1ce00 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69  */..  int szRegi
1ce10 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1ce20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
1ce30 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1ce40 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69  s */.  int nRegi
1ce50 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1ce60 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
1ce70 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
1ce80 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20   u8 isReadonly; 
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1cea0 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79  rue if read-only
1ceb0 20 2a 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63   */.  u8 isUnloc
1cec0 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ked;            
1ced0 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44   /* True if no D
1cee0 4d 53 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a  MS lock held */.
1cef0 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
1cf00 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
1cf10 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
1cf20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
1cf30 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
1cf40 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
1cf50 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
1cf60 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
1cf70 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
1cf80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
1cf90 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
1cfa0 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
1cfb0 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
1cfc0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1cfd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1cfe0 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
1cff0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1d000 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
1d010 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1d020 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
1d030 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1d040 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
1d050 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
1d060 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1d070 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
1d080 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1d090 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ts */.#if define
1d0a0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1d0b0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1d0c0 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
1d0d0 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d0f0 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
1d100 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  winShm.id value 
1d110 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1d120 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72  .** A global arr
1d130 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  ay of all winShm
1d140 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  Node objects..**
1d150 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75  .** The winShmMu
1d160 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1d170 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
1d180 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1d190 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
1d1a0 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20  atic winShmNode 
1d1b0 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20  *winShmNodeList 
1d1c0 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  = 0;../*.** Stru
1d1d0 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
1d1e0 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
1d1f0 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
1d200 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
1d210 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
1d220 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
1d230 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1d240 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
1d250 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
1d260 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
1d270 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
1d280 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
1d290 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77  fter:.**.**    w
1d2a0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a  inShm.pShmNode.*
1d2b0 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a  *    winShm.id.*
1d2c0 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
1d2d0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
1d2e0 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68  rite.  The winSh
1d2f0 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  m.pShmNode->mute
1d300 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1d310 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1d320 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1d330 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1d340 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
1d350 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1d360 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
1d370 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
1d380 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
1d390 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d3b0 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
1d3c0 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
1d3d0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
1d3e0 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
1d3f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d400 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
1d410 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
1d420 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
1d430 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d440 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
1d450 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1d460 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
1d470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1d480 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
1d490 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
1d4a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d4b0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1d4c0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53  d(SQLITE_HAVE_OS
1d4d0 5f 54 52 41 43 45 29 0a 20 20 75 38 20 69 64 3b  _TRACE).  u8 id;
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4f0 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
1d500 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
1d510 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64  th its winShmNod
1d520 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1d530 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
1d540 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1d550 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f  .*/.#define WIN_
1d560 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
1d570 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1d580 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66  )*4)        /* f
1d590 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
1d5a0 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
1d5b0 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48  M_DMS    (WIN_SH
1d5c0 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
1d5d0 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
1d5e0 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
1d5f0 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
1d600 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1d610 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
1d620 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
1d630 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f  .#define WINSHM_
1d640 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
1d650 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 20 20 32   WINSHM_RDLCK  2
1d660 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f  .#define WINSHM_
1d670 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
1d680 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
1d690 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
1d6a0 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
1d6b0 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
1d6c0 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
1d6d0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
1d6e0 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
1d6f0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49  e,         /* WI
1d700 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 53  NSHM_UNLCK, WINS
1d710 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 57 49 4e  HM_RDLCK, or WIN
1d720 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
1d730 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1d740 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
1d750 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
1d760 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
1d770 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
1d780 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
1d790 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1d7a0 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1d7b0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
1d7c0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1d7d0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1d7e0 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
1d7f0 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
1d800 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
1d810 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1d820 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
1d830 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
1d840 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1d850 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 73 71 6c  ->nRef==0 || sql
1d860 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d870 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b  pFile->mutex) );
1d880 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
1d890 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
1d8a0 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d  lock=%d, offset=
1d8b0 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a  %d, size=%d\n",.
1d8c0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1d8d0 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54  ->hFile.h, lockT
1d8e0 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65  ype, ofst, nByte
1d8f0 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  ));..  /* Releas
1d900 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
1d910 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
1d920 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
1d930 65 3d 3d 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20  e==WINSHM_UNLCK 
1d940 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
1d950 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1d960 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c  ->hFile.h, ofst,
1d970 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1d980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1d990 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
1d9a0 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
1d9b0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77   */.    DWORD dw
1d9c0 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45  Flags = LOCKFILE
1d9d0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
1d9e0 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  Y;.    if( lockT
1d9f0 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 57 52  ype == WINSHM_WR
1da00 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d  LCK ) dwFlags |=
1da10 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
1da20 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  IVE_LOCK;.    rc
1da30 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
1da40 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1da50 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30  dwFlags, ofst, 0
1da60 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
1da70 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29  ..  if( rc!= 0 )
1da80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1da90 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1daa0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1dab0 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
1dac0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
1dad0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1dae0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1daf0 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1db00 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f  , func=%s, errno
1db10 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  =%lu, rc=%s\n",.
1db20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1db30 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b  ->hFile.h, (lock
1db40 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 55  Type == WINSHM_U
1db50 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f  NLCK) ? "winUnlo
1db60 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20  ckFile" :.      
1db70 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c       "winLockFil
1db80 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  e", pFile->lastE
1db90 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72  rrno, sqlite3Err
1dba0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72  Name(rc)));..  r
1dbb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1dbc0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1dbd0 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
1dbe0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1dbf0 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  winOpen(sqlite3_
1dc00 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  vfs*,const char*
1dc10 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  ,sqlite3_file*,i
1dc20 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  nt,int*);.static
1dc30 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73   int winDelete(s
1dc40 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e  qlite3_vfs *,con
1dc50 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
1dc60 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
1dc70 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  winShmNodeList l
1dc80 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
1dc90 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f  es with winShmNo
1dca0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1dcb0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1dcc0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1dcd0 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1dce0 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1dcf0 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1dd00 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1dd10 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1dd20 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1dd30 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66  Purge(sqlite3_vf
1dd40 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c  s *pVfs, int del
1dd50 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53  eteFlag){.  winS
1dd60 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77  hmNode **pp;.  w
1dd70 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20  inShmNode *p;.  
1dd80 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
1dd90 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f  texHeld() );.  O
1dda0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1ddb0 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65  GE pid=%lu, dele
1ddc0 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20  teFlag=%d\n",.  
1ddd0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1dde0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1ddf0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a  , deleteFlag));.
1de00 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f    pp = &winShmNo
1de10 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
1de20 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b   (p = *pp)!=0 ){
1de30 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
1de40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1de50 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   i;.      if( p-
1de60 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65  >mutex ){ sqlite
1de70 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
1de80 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20  mutex); }.      
1de90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
1dea0 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
1deb0 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20       BOOL bRc = 
1dec0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
1ded0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1dee0 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
1def0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1df00 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75  GE-UNMAP pid=%lu
1df10 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1df20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1df30 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1df40 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1df50 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1df60 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1df70 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1df80 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1df90 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
1dfa0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e  sCloseHandle(p->
1dfb0 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
1dfc0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
1dfd0 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c  E(("SHM-PURGE-CL
1dfe0 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  OSE pid=%lu, reg
1dff0 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ion=%d, rc=%s\n"
1e000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e010 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1e020 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62  rocessId(), i, b
1e030 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
1e040 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
1e050 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f  UNUSED_VARIABLE_
1e060 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20  VALUE(bRc);.    
1e070 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
1e080 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26  >hFile.h!=NULL &
1e090 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e  & p->hFile.h!=IN
1e0a0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1e0b0 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  UE ){.        Si
1e0c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1e0d0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1e0e0 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  winClose((sqlite
1e0f0 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69  3_file *)&p->hFi
1e100 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  le);.        Sim
1e110 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1e120 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1e130 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
1e140 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53  lag ){.        S
1e150 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1e160 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1e170 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
1e180 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1e190 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70       winDelete(p
1e1a0 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d  Vfs, p->zFilenam
1e1b0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
1e1c0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1e1d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1e1e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e1f0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1e200 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
1e210 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1e220 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1e230 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  Region);.      s
1e240 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1e250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e260 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b   pp = &p->pNext;
1e270 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1e280 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f 63 6b  .** The DMS lock
1e290 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1e2a0 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d 20 66  n taken on shm f
1e2b0 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20 41 74  ile pShmNode. At
1e2c0 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61 6b 65  tempt to.** take
1e2d0 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72 6e 20   it now. Return 
1e2e0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
1e2f0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1e300 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1e310 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1e320 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d 53 20  *.** If the DMS 
1e330 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64  cannot be locked
1e340 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
1e350 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d   a readonly_shm=
1e360 31 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  1.** connection 
1e370 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  and no other pro
1e380 63 65 73 73 20 61 6c 72 65 61 64 79 20 68 6f 6c  cess already hol
1e390 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65 74 75 72  ds a lock, retur
1e3a0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 45 41 44  n.** SQLITE_READ
1e3b0 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 61 6e  ONLY_CANTINIT an
1e3c0 64 20 73 65 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  d set pShmNode->
1e3d0 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f  isUnlocked=1..*/
1e3e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
1e3f0 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  ockSharedMemory(
1e400 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1e410 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Node){.  int rc 
1e420 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1e430 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
1e440 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_WRLCK, WIN_S
1e450 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 0a 20 20 69  HM_DMS, 1);..  i
1e460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e470 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   ){.    if( pShm
1e480 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
1e490 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   ){.      pShmNo
1e4a0 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d  de->isUnlocked =
1e4b0 20 31 3b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   1;.      winShm
1e4c0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1e4d0 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43  ode, WINSHM_UNLC
1e4e0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1e4f0 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
1e500 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1e510 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20 20 20 7d  _CANTINIT;.    }
1e520 65 6c 73 65 20 69 66 28 20 77 69 6e 54 72 75 6e  else if( winTrun
1e530 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
1e540 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
1e550 46 69 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  File, 0) ){.    
1e560 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
1e570 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
1e580 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1e590 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1e5a0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1e5b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e5c0 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
1e5d0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 53 68        "winLockSh
1e600 61 72 65 64 4d 65 6d 6f 72 79 22 2c 20 70 53 68  aredMemory", pSh
1e610 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1e620 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e640 4b 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 53  K ){.    winShmS
1e650 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1e660 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  de, WINSHM_UNLCK
1e670 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1e680 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1e690 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1e6a0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1e6b0 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_RDLCK, WIN_SH
1e6c0 4d 5f 44 4d 53 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  M_DMS, 1);.}../*
1e6d0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61  .** Open the sha
1e6e0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1e6f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e700 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
1e710 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  bFd..**.** When 
1e720 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1e730 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1e740 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1e750 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1e760 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1e770 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1e780 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1e790 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1e7a0 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1e7b0 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1e7c0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1e7d0 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1e7e0 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1e7f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1e800 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1e810 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  ry(winFile *pDbF
1e820 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e  d){.  struct win
1e830 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1e840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e850 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1e860 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 77 69 6e   opened */.  win
1e870 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1e880 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1e890 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1e8a0 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
1e8b0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1e8c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1e8d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1e8e0 20 63 6f 64 65 20 2a 2f 0a 20 20 77 69 6e 53 68   code */.  winSh
1e8f0 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e910 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
1e920 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1e930 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
1e960 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Name in bytes */
1e970 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ..  assert( pDbF
1e980 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20  d->pShm==0 );   
1e990 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73   /* Not previous
1e9a0 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20  ly opened */..  
1e9b0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1e9c0 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71  e for the new sq
1e9d0 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74  lite3_shm object
1e9e0 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74  .  Also speculat
1e9f0 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ively.  ** alloc
1ea00 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
1ea10 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61  new winShmNode a
1ea20 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a  nd filename..  *
1ea30 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  /.  p = sqlite3M
1ea40 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1ea50 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1ea60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1ea70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1ea80 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  BKPT;.  nName = 
1ea90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1eaa0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1eab0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1eac0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1ead0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1eae0 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1eaf0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1eb00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1eb10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1eb20 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1eb30 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4e 65  _BKPT;.  }.  pNe
1eb40 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  w->zFilename = (
1eb50 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
1eb60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1eb70 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65  tf(nName+15, pNe
1eb80 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25  w->zFilename, "%
1eb90 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
1eba0 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  Path);.  sqlite3
1ebb0 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
1ebc0 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e  d->zPath, pNew->
1ebd0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f  zFilename);..  /
1ebe0 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
1ebf0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
1ec00 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
1ec10 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1ec20 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
1ec30 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
1ec40 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
1ec50 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
1ec60 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
1ec70 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1ec80 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
1ec90 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1eca0 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
1ecb0 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
1ecc0 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
1ecd0 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
1ece0 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
1ecf0 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
1ed00 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
1ed10 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
1ed20 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
1ed30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1ed40 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
1ed50 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1ed60 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1ed70 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
1ed80 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
1ed90 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1eda0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
1edb0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 6e  else{.    int in
1edc0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
1edd0 50 45 4e 5f 57 41 4c 3b 0a 20 20 20 20 69 6e 74  PEN_WAL;.    int
1ede0 20 6f 75 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a   outFlags = 0;..
1edf0 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
1ee00 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
1ee10 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
1ee20 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
1ee30 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
1ee40 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
1ee50 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
1ee60 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
1ee70 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
1ee80 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
1ee90 4e 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 73  Node;..    if( s
1eea0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1eeb0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
1eec0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1eed0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
1eee0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1eef0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1ef00 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
1ef10 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1ef20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ef30 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ef40 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1ef50 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1ef60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ef70 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
1ef80 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1ef90 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
1efa0 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
1efb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 46 6c 61 67   ){.      inFlag
1efc0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1efd0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
1efe0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
1eff0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f000 20 20 69 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c    inFlags |= SQL
1f010 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1f020 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  Y;.    }.    rc 
1f030 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d  = winOpen(pDbFd-
1f040 3e 70 56 66 73 2c 20 70 53 68 6d 4e 6f 64 65 2d  >pVfs, pShmNode-
1f050 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  >zFilename,.    
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1f070 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1f080 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 0a 20 20  mNode->hFile,.  
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1f0a0 6e 46 6c 61 67 73 2c 20 26 6f 75 74 46 6c 61 67  nFlags, &outFlag
1f0b0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
1f0c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f0d0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1f0e0 72 6f 72 28 72 63 2c 20 6f 73 47 65 74 4c 61 73  ror(rc, osGetLas
1f0f0 74 45 72 72 6f 72 28 29 2c 20 22 77 69 6e 4f 70  tError(), "winOp
1f100 65 6e 53 68 6d 22 2c 0a 20 20 20 20 20 20 20 20  enShm",.        
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f120 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1f130 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
1f140 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1f150 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 75 74 46    }.    if( outF
1f160 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  lags==SQLITE_OPE
1f170 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 20 70 53 68  N_READONLY ) pSh
1f180 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
1f190 79 20 3d 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d  y = 1;..    rc =
1f1a0 20 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65   winLockSharedMe
1f1b0 6d 6f 72 79 28 70 53 68 6d 4e 6f 64 65 29 3b 0a  mory(pShmNode);.
1f1c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f1d0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1f1e0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
1f1f0 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68 6d  TINIT ) goto shm
1f200 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
1f210 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
1f220 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
1f230 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53  hild of the winS
1f240 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
1f250 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
1f260 64 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  de;.#if defined(
1f270 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1f280 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f290 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20  HAVE_OS_TRACE). 
1f2a0 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
1f2b0 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
1f2c0 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
1f2d0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
1f2e0 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
1f2f0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1f300 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1f310 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1f320 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1f330 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1f340 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1f350 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1f360 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  he winShmEnterMu
1f370 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
1f380 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
1f390 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
1f3a0 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62  truct winShm) ob
1f3b0 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
1f3c0 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
1f3d0 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
1f3e0 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
1f3f0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
1f400 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
1f410 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
1f420 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
1f430 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
1f440 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
1f450 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
1f460 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
1f470 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  utex.  ** mutex.
1f480 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1f490 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1f4a0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1f4b0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1f4c0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1f4d0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1f4e0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1f4f0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1f500 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1f510 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
1f520 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
1f530 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
1f540 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d  en_err:.  winShm
1f550 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1f560 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43  ode, WINSHM_UNLC
1f570 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1f580 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
1f590 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
1f5a0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
1f5b0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1f5c0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1f5d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1f5e0 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
1f5f0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
1f600 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1f610 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f620 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1f630 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
1f640 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
1f650 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
1f660 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ing.** storage i
1f670 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
1f680 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
1f690 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28  int winShmUnmap(
1f6a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1f6b0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1f6c0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1f6d0 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
1f6e0 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
1f6f0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
1f700 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20  /* Delete after 
1f710 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20  closing if true 
1f720 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1f730 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a  *pDbFd;       /*
1f740 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1f750 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
1f760 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20  */.  winShm *p; 
1f770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f780 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1f790 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77  be closed */.  w
1f7a0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1f7b0 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
1f7c0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1f7d0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77  mory file */.  w
1f7e0 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  inShm **pp;     
1f7f0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1f800 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
1f810 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1f820 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
1f830 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
1f840 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
1f850 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1f860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
1f870 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1f880 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ode;..  /* Remov
1f890 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
1f8a0 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
1f8b0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
1f8c0 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
1f8d0 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
1f8e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1f8f0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1f900 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
1f910 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1f920 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
1f930 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
1f940 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1f950 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
1f960 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
1f970 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1f980 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
1f990 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
1f9a0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1f9b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
1f9c0 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
1f9d0 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
1f9e0 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
1f9f0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1fa00 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
1fa10 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
1fa20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1fa30 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
1fa40 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
1fa50 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
1fa60 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
1fa70 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
1fa80 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72  ){.    winShmPur
1fa90 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1faa0 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d  deleteFlag);.  }
1fab0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1fac0 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1fad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1fae0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1faf0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
1fb00 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
1fb10 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
1fb20 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b  c int winShmLock
1fb30 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1fb40 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1fb50 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
1fb60 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
1fb70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1fb80 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1fb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1fba0 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
1fbb0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
1fbc0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbe0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
1fbf0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1fc00 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1fc10 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1fc20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
1fc30 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
1fc40 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ck */.){.  winFi
1fc50 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1fc60 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20  File*)fd;       
1fc70 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1fc80 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1fc90 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1fca0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1fcb0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1fcc0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
1fcd0 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
1fce0 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  d */.  winShm *p
1fcf0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd10 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1fd20 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
1fd30 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1fd40 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1fd50 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1fd60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fd80 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1fd90 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1fdc0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
1fdd0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1fde0 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
1fdf0 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
1fe00 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
1fe10 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
1fe20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
1fe30 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1fe40 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1fe50 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
1fe60 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1fe70 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
1fe80 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
1fe90 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
1fea0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1feb0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
1fec0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1fed0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1fee0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1fef0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1ff00 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
1ff10 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
1ff20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1ff30 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
1ff40 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75   );..  mask = (u
1ff50 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e  16)((1U<<(ofst+n
1ff60 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29  )) - (1U<<ofst))
1ff70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
1ff80 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
1ff90 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
1ffa0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1ffb0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1ffc0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1ffd0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
1ffe0 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
1fff0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
20000 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
20010 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
20020 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
20030 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
20040 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
20050 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
20060 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
20070 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
20080 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
20090 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
200a0 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
200b0 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
200c0 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
200d0 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
200e0 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
200f0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
20100 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
20110 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
20120 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
20130 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
20140 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
20150 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
20160 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
20170 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  WINSHM_UNLCK, of
20180 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
20190 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
201a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
201b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
201c0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
201d0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
201e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
201f0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
20200 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
20210 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
20220 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
20230 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
20240 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
20250 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
20260 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
20270 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
20280 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
20290 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
202a0 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
202b0 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
202c0 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
202d0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
202e0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
202f0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
20300 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
20310 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
20320 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
20330 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
20340 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
20350 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
20360 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
20370 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
20380 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
20390 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
203a0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
203b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
203c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
203d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
203e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
203f0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
20400 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
20410 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
20420 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
20430 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
20440 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
20450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
20470 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
20480 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
20490 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
204a0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
204b0 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 2c  e, WINSHM_RDLCK,
204c0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
204d0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
204e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
204f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20500 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20510 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
20520 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
20530 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20550 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
20560 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
20570 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
20580 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
20590 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
205a0 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
205b0 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
205c0 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
205d0 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
205e0 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
205f0 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
20600 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
20610 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
20620 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
20630 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
20640 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
20650 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
20660 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
20670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20680 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
20690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
206a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
206b0 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
206c0 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
206d0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
206e0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
206f0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
20700 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
20710 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
20720 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
20730 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20750 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
20760 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49  ock(pShmNode, WI
20770 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  NSHM_WRLCK, ofst
20780 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
20790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
207a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
207b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
207c0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
207d0 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
207e0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
207f0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
20800 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
20810 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20820 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
20830 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
20840 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20  M-LOCK pid=%lu, 
20850 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73  id=%d, sharedMas
20860 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b  k=%03x, exclMask
20870 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%03x, rc=%s\n",
20880 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20890 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
208a0 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73  d(), p->id, p->s
208b0 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
208c0 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
208d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d     sqlite3ErrNam
208e0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
208f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
20900 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
20910 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
20920 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
20930 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  red memory..**.*
20940 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
20950 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
20960 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
20970 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
20980 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
20990 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
209a0 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
209b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
209c0 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
209d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
209e0 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
209f0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
20a00 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
20a10 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
20a20 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
20a30 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79  .  sqlite3Memory
20a40 42 61 72 72 69 65 72 28 29 3b 20 20 20 2f 2a 20  Barrier();   /* 
20a50 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64  compiler-defined
20a60 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
20a70 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
20a80 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 2f  Mutex();       /
20a90 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
20aa0 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
20ab0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
20ac0 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ex();.}../*.** T
20ad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20ae0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
20af0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
20b00 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
20b10 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  the.** shared-me
20b20 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
20b30 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
20b40 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
20b50 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
20b60 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
20b70 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
20b80 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
20b90 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
20ba0 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79  s szRegion.** by
20bb0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
20bc0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
20bd0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
20be0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
20bf0 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
20c00 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
20c10 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
20c20 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74   isWrite paramet
20c30 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
20c40 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
20c50 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
20c60 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
20c70 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
20c80 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
20c90 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
20ca0 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
20cb0 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
20cc0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
20cd0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
20ce0 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
20cf0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
20d00 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
20d10 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
20d20 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
20d30 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61  ot yet.** been a
20d40 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
20d50 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
20d60 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
20d70 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
20d80 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
20d90 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
20da0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
20db0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
20dc0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
20dd0 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
20de0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
20df0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
20e00 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  es.** address sp
20e10 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
20e20 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
20e30 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
20e40 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a  to the mapped.**
20e50 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
20e60 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
20e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
20e80 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
20e90 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
20ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
20eb0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
20ec0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20ed0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
20f00 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
20f10 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
20f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20f30 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
20f40 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
20f70 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
20f80 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
20f90 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20fb0 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
20fc0 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
20fd0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
20fe0 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
20ff0 6d 20 2a 70 53 68 6d 20 3d 20 70 44 62 46 64 2d  m *pShm = pDbFd-
21000 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
21010 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
21020 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d   DWORD protect =
21030 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b   PAGE_READWRITE;
21040 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d  .  DWORD flags =
21050 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
21060 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b  | FILE_MAP_READ;
21070 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21080 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
21090 53 68 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Shm ){.    rc = 
210a0 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
210b0 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
210c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
210d0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
210e0 20 20 20 70 53 68 6d 20 3d 20 70 44 62 46 64 2d     pShm = pDbFd-
210f0 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
21100 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 2d 3e 70 53  mNode = pShm->pS
21110 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74  hmNode;..  sqlit
21120 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
21130 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
21140 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
21150 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20  >isUnlocked ){. 
21160 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 53     rc = winLockS
21170 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 53 68 6d  haredMemory(pShm
21180 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Node);.    if( r
21190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
211a0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
211b0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69  .    pShmNode->i
211c0 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  sUnlocked = 0;. 
211d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52   }.  assert( szR
211e0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
211f0 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
21200 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
21210 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
21220 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
21230 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
21240 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
21250 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
21260 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
21270 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
21280 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
21290 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
212a0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
212b0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
212c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
212d0 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
212e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
212f0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
21300 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
21310 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
21320 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
21330 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
21340 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
21350 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
21360 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
21370 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
21380 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
21390 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
213a0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
213b0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
213c0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
213d0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
213e0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
213f0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
21400 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
21410 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
21420 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
21430 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
21440 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
21450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21460 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
21470 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
21480 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
21490 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
214c0 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
214d0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
214e0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
214f0 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
21500 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
21510 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
21520 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
21530 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
21540 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
21550 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
21560 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
21570 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
21580 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
21590 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
215a0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
215b0 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
215c0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
215d0 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
215e0 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
215f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
21600 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
21610 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
21620 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
21630 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
21640 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
21650 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
21660 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
21670 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
21680 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
21690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
216a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
216b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
216c0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
216d0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
216e0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
216f0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
21700 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
21710 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
21720 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
21730 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
21740 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
21750 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
21760 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
21770 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
21780 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
21790 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
217a0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
217b0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
217c0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
217d0 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
217e0 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
217f0 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
21800 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
21810 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
21820 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21830 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
21840 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
21850 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
21860 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e  e->aRegion = apN
21870 65 77 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  ew;..    if( pSh
21880 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
21890 79 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  y ){.      prote
218a0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e  ct = PAGE_READON
218b0 4c 59 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  LY;.      flags 
218c0 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b  = FILE_MAP_READ;
218d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
218e0 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
218f0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
21900 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  .      HANDLE hM
21910 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ap = NULL;      
21920 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69     /* file-mappi
21930 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ng handle */.   
21940 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20     void *pMap = 
21950 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
21960 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  * Mapped memory 
21970 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53  region */..#if S
21980 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
21990 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
219a0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
219b0 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d  romApp(pShmNode-
219c0 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
219d0 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63      NULL, protec
219e0 74 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  t, nByte, NULL. 
219f0 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
21a00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
21a10 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
21a20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
21a30 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
21a40 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
21a50 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
21a60 2c 20 70 72 6f 74 65 63 74 2c 20 30 2c 20 6e 42  , protect, 0, nB
21a70 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
21a80 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
21a90 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
21aa0 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54  S_ANSI) && SQLIT
21ab0 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
21ac0 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 20  LEMAPPINGA.     
21ad0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
21ae0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
21af0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
21b00 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
21b10 70 72 6f 74 65 63 74 2c 20 30 2c 20 6e 42 79 74  protect, 0, nByt
21b20 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
21b30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
21b40 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
21b50 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
21b60 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d  region=%d, size=
21b70 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
21b90 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
21ba0 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
21bb0 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
21bd0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
21be0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
21bf0 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
21c00 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
21c10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
21c20 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
21c30 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
21c40 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
21c50 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
21c60 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
21c70 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
21c80 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
21c90 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
21ca0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
21cb0 68 4d 61 70 2c 20 66 6c 61 67 73 2c 0a 20 20 20  hMap, flags,.   
21cc0 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
21cd0 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
21ce0 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
21cf0 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
21d00 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
21d10 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
21d20 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 66  ewOfFile(hMap, f
21d30 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
21d40 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
21d50 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
21d60 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
21d70 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
21d80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
21d90 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
21da0 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  -MAP pid=%lu, re
21db0 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d  gion=%d, offset=
21dc0 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
21dd0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
21de0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
21df0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
21e00 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
21e10 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
21e30 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
21e40 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
21e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21e60 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
21e70 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
21e80 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
21e90 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
21ea0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
21eb0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21ec0 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
21ed0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
21f00 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
21f10 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
21f20 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
21f30 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
21f40 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
21f50 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
21f60 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21f70 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
21f80 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
21f90 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
21fa0 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
21fb0 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
21fc0 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
21fd0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21fe0 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
21ff0 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
22000 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
22010 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
22020 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
22030 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
22040 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
22050 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
22060 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
22070 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
22080 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
22090 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
220a0 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
220b0 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
220c0 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
220d0 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
220e0 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
220f0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
22100 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
22110 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
22120 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
22130 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
22140 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
22150 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
22160 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
22170 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22180 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
22190 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  winShmMap     0.
221a0 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c  # define winShmL
221b0 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
221c0 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20  e winShmBarrier 
221d0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
221e0 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
221f0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
22200 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
22210 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70  ./*.** Cleans up
22220 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69   the mapped regi
22230 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66  on of the specif
22240 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79  ied file, if any
22250 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
22260 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
22270 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
22280 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  mapfile(winFile 
22290 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72  *pFile){.  asser
222a0 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
222b0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
222c0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
222d0 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70  File=%p, hMap=%p
222e0 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c  , pMapRegion=%p,
222f0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d   ".           "m
22300 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d  mapSize=%lld, mm
22310 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e  apSizeMax=%lld\n
22320 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
22330 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
22340 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
22350 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65  ile->hMap, pFile
22360 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20  ->pMapRegion,.  
22370 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
22380 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d  mmapSize, pFile-
22390 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a  >mmapSizeMax));.
223a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61    if( pFile->pMa
223b0 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  pRegion ){.    i
223c0 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f  f( !osUnmapViewO
223d0 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61  fFile(pFile->pMa
223e0 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20  pRegion) ){.    
223f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
22400 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
22410 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
22420 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
22430 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
22440 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d  =%p, pMapRegion=
22450 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %p, ".          
22460 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f       "rc=SQLITE_
22470 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f  IOERR_MMAP\n", o
22480 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
22490 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
224b0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
224c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
224d0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
224e0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
224f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
22500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22510 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
22520 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65  mapfile1", pFile
22530 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
22540 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
22550 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
22560 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
22570 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46   0;.  }.  if( pF
22580 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20  ile->hMap!=NULL 
22590 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c  ){.    if( !osCl
225a0 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
225b0 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20  >hMap) ){.      
225c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
225d0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
225e0 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
225f0 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
22600 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
22610 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53  p, hMap=%p, rc=S
22620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
22630 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22640 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22650 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
22660 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29  le, pFile->hMap)
22670 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22680 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
22690 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
226a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
226b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
226c0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
226d0 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65  mapfile2", pFile
226e0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
226f0 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
22700 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53  = NULL;.  }.  OS
22710 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
22720 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
22730 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
22740 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
22750 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
22760 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
22770 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
22780 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22790 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
227a0 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
227b0 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
227c0 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
227d0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
227e0 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
227f0 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
22800 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
22810 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
22820 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72   if.** there alr
22830 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
22840 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
22850 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
22860 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73  re still.** outs
22870 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
22880 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
22890 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
228a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
228b0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
228c0 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
228d0 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
228e0 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
228f0 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d  size of.** the m
22900 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
22910 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
22920 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
22930 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
22940 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73  e.** requested s
22950 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
22960 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
22970 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
22980 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
22990 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
229a0 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
229b0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
229c0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
229d0 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c  red.** using SQL
229e0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
229f0 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69  IZE, whichever i
22a00 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
22a10 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
22a20 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
22a30 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
22a40 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
22a50 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
22a60 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
22a70 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
22a80 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
22a90 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
22aa0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
22ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
22ac0 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
22ad0 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69   *pFd, sqlite3_i
22ae0 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73  nt64 nByte){.  s
22af0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61  qlite3_int64 nMa
22b00 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  p = nByte;.  int
22b10 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
22b20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
22b30 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
22b40 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
22b50 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
22b60 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c  ile=%p, size=%ll
22b70 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
22b80 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22b90 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e  cessId(), pFd, n
22ba0 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70  Byte));..  if( p
22bb0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
22bc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22bd0 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
22be0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 ){.    rc = wi
22bf0 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
22c00 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e  e3_file*)pFd, &n
22c10 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Map);.    if( rc
22c20 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
22c30 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
22c40 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
22c50 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22c60 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20  FSTAT\n",.      
22c70 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
22c80 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
22c90 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72  , pFd));.      r
22ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
22cb0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
22cc0 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
22cd0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
22ce0 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
22cf0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
22d00 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28    }.  nMap &= ~(
22d10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77  sqlite3_int64)(w
22d20 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
22d30 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66  Size - 1);..  if
22d40 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64  ( nMap==0 && pFd
22d50 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
22d60 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
22d70 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pFd);.  }.  if(
22d80 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
22d90 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64  Size ){.    void
22da0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
22db0 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
22dc0 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
22dd0 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d     DWORD flags =
22de0 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
22df0 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
22e00 65 28 70 46 64 29 3b 0a 23 69 66 64 65 66 20 53  e(pFd);.#ifdef S
22e10 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57  QLITE_MMAP_READW
22e20 52 49 54 45 0a 20 20 20 20 69 66 28 20 28 70 46  RITE.    if( (pF
22e30 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
22e40 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
22e50 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
22e60 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
22e70 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
22e80 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
22e90 54 45 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  TE;.    }.#endif
22ea0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
22eb0 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INRT.    pFd->hM
22ec0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
22ed0 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
22ee0 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
22ef0 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c  otect, nMap, NUL
22f00 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
22f10 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
22f20 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64  AS_WIDE).    pFd
22f30 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
22f40 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46  eFileMappingW(pF
22f50 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
22f60 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
22f90 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
22fa0 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
22fd0 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
22fe0 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ), NULL);.#elif 
22ff0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
23000 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
23010 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  & SQLITE_WIN32_C
23020 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47  REATEFILEMAPPING
23030 41 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  A.    pFd->hMap 
23040 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
23050 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e  ppingA(pFd->h, N
23060 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
23090 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
230a0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
230e0 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
230f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
23100 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c  ( pFd->hMap==NUL
23110 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  L ){.      pFd->
23120 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
23130 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
23140 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
23150 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
23160 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73  R_MMAP, pFd->las
23170 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23190 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70 46  winMapfile1", pF
231a0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
231b0 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f   /* Log the erro
231c0 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  r, but continue 
231d0 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e  normal operation
231e0 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
231f0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54  ite */.      OST
23200 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d  RACE(("MAP-FILE-
23210 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
23220 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
23230 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
23240 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
23250 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
23260 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
23270 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
23280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23290 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
232a0 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73 49   (nMap % winSysI
232b0 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29 3d  nfo.dwPageSize)=
232c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
232d0 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29  ( sizeof(SIZE_T)
232e0 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ==sizeof(sqlite3
232f0 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c  _int64) || nMap<
23300 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a 23  =0xffffffff );.#
23310 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23320 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  RT.    pNew = os
23330 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
23340 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20  mApp(pFd->hMap, 
23350 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f  flags, 0, (SIZE_
23360 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20  T)nMap);.#else. 
23370 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56     pNew = osMapV
23380 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68  iewOfFile(pFd->h
23390 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  Map, flags, 0, 0
233a0 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
233b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
233c0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
233d0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
233e0 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20  e(pFd->hMap);.  
233f0 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
23400 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d  NULL;.      pFd-
23410 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
23420 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
23430 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
23440 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23450 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
23460 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70  "winMapfile2", p
23490 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
234a0 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
234b0 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
234c0 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
234d0 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
234e0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
234f0 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
23500 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  -MAP pid=%lu, pF
23510 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
23520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23530 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
23540 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73  cessId(), pFd, s
23550 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
23560 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
23570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
23580 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70   }.    pFd->pMap
23590 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20  Region = pNew;. 
235a0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
235b0 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20   = nMap;.  }..  
235c0 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
235d0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
235e0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
235f0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
23600 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
23610 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29  ocessId(), pFd))
23620 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23630 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
23640 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
23650 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
23660 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
23670 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
23680 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
23690 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
236a0 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
236b0 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
236c0 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
236d0 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
236e0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
236f0 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
23700 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
23710 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
23720 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
23730 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
23740 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
23750 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
23760 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
23770 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
23780 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
23790 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
237a0 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
237b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
237c0 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
237d0 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
237e0 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
237f0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
23800 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
23810 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
23820 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
23830 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
23840 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  ly.** release th
23850 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
23860 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63  alling winUnfetc
23870 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
23880 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69  nt winFetch(sqli
23890 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
238a0 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
238b0 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
238c0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
238d0 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
238e0 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
238f0 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
23900 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
23910 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
23920 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
23930 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
23940 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
23950 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
23960 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d  , amount=%d, pp=
23970 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
23980 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
23990 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69  ocessId(), fd, i
239a0 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b  Off, nAmt, pp));
239b0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
239c0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
239d0 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
239e0 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
239f0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
23a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
23a10 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
23a20 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
23a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53  OK ){.        OS
23a50 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
23a60 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
23a70 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
23a80 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
23a90 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
23aa0 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
23ab0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
23ac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
23ad0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
23ae0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
23af0 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
23b00 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
23b10 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
23b20 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
23b30 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
23b40 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
23b50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
23b60 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
23b70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
23b80 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c  , pp=%p, *pp=%p,
23b90 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
23ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
23bb0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
23bc0 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70  Id(), fd, pp, *p
23bd0 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p));.  return SQ
23be0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23bf0 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
23c00 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
23c10 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
23c20 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
23c30 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20   a.** reference 
23c40 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
23c50 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77  arlier call to w
23c60 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  inFetch(). The s
23c70 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
23c80 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
23c90 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
23ca0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
23cb0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
23cc0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
23cd0 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
23ce0 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e  he winFetch() in
23cf0 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  vocation..**.** 
23d00 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
23d10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
23d20 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
23d30 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
23d40 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f  alled.** to info
23d50 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
23d60 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
23d70 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
23d80 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a  xisting mapping.
23d90 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
23da0 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
23db0 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
23dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
23dd0 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
23de0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
23df0 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
23e00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
23e10 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
23e20 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
23e30 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
23e40 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
23e50 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  ase file */..  /
23e60 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
23e70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
23e80 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
23e90 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
23ea0 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ing.  ** xFetch 
23eb0 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
23ec0 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
23ed0 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
23ee0 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
23ef0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
23f00 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
23f10 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
23f20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
23f30 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
23f40 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
23f50 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
23f60 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
23f70 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
23f80 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
23f90 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
23fa0 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
23fb0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
23fc0 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  UNFETCH pid=%lu,
23fd0 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
23fe0 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c  t=%lld, p=%p\n",
23ff0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
24000 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
24010 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20  d(), pFd, iOff, 
24020 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  p));..  if( p ){
24030 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
24040 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
24050 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49      /* FIXME:  I
24060 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20  f Windows truly 
24070 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73 20  always prevents 
24080 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65  truncating or de
24090 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  leting a.    ** 
240a0 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70  file while a map
240b0 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68  ping is held, th
240c0 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
240d0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20   winUnmapfile() 
240e0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75  call.    ** is u
240f0 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20 62  nnecessary can b
24100 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
24110 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
24120 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
24130 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
24140 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
24150 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
24160 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
24170 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
24180 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
24190 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
241a0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
241b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
241c0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
241d0 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
241e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
241f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
24200 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
24210 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
24220 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
24230 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
24240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
24250 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
24260 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
24270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24280 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
24290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242d0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
242e0 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
242f0 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
24300 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
24310 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
24320 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
24330 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
24340 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
24350 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
24360 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
24390 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
243a0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
243b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
243c0 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
243d0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
243e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
243f0 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
24400 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24410 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
24420 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
24430 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
24440 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
24450 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
24460 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
24480 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
24490 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
244a0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
244b0 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
244c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
244d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
244e0 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
244f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24500 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
24510 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
24520 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
24530 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
24540 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
24550 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
24560 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
24570 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
24580 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
24590 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
245a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
245b0 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
245c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
245d0 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
245e0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
245f0 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
24600 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
24610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24620 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
24630 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
24640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24650 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
24660 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
24670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24680 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
24690 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
246a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246b0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
246c0 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246e0 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
246f0 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
24720 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  };../*.** This v
24730 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
24740 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
24750 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
24760 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
24770 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 20 77  file for win32 w
24780 69 74 68 6f 75 74 20 70 65 72 66 6f 72 6d 69 6e  ithout performin
24790 67 20 61 6e 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  g any locking..*
247a0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
247b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
247c0 73 20 77 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74  s winIoNolockMet
247d0 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20  hod = {.  3,    
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
24800 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
24810 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
24820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
24830 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
24840 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
24860 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
24870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24880 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
24890 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
248a0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
248b0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
248c0 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
248d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
248e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
248f0 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
24900 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
24910 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
24920 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f  ize */.  winNolo
24930 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
24940 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
24950 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b  k */.  winNolock
24960 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
24970 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
24980 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b  k */.  winNolock
24990 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
249a0 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
249b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
249c0 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
249d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
249e0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
249f0 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
24a00 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
24a10 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
24a20 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
24a30 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
24a40 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
24a50 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
24a60 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
24a70 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
24a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
24a90 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
24aa0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
24ac0 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
24ad0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
24ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24af0 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
24b00 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  inShmUnmap,     
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b20 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
24b30 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20   winFetch,      
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20   /* xFetch */.  
24b60 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20  winUnfetch      
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d  /* xUnfetch */.}
24b90 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e 56 66 73  ;..static winVfs
24ba0 41 70 70 44 61 74 61 20 77 69 6e 41 70 70 44 61  AppData winAppDa
24bb0 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e 49 6f 4d  ta = {.  &winIoM
24bc0 65 74 68 6f 64 2c 20 20 20 20 20 20 20 2f 2a 20  ethod,       /* 
24bd0 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  pMethod */.  0, 
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bf0 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
24c00 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
24c10 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b        /* bNoLock
24c20 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 77   */.};..static w
24c30 69 6e 56 66 73 41 70 70 44 61 74 61 20 77 69 6e  inVfsAppData win
24c40 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61 20 3d 20  NolockAppData = 
24c50 7b 0a 20 20 26 77 69 6e 49 6f 4e 6f 6c 6f 63 6b  {.  &winIoNolock
24c60 4d 65 74 68 6f 64 2c 20 2f 2a 20 70 4d 65 74 68  Method, /* pMeth
24c70 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  od */.  0,      
24c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
24c90 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 31 20 20  AppData */.  1  
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d   /* bNoLock */.}
24cc0 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
24cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d10 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
24d30 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
24d40 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
24d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
24d60 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
24d70 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
24d80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
24d90 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
24da0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
24db0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20  object..*/..#if 
24dc0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
24dd0 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  __)./*.** Conver
24de0 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
24df0 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
24e00 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
24e10 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
24e20 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
24e30 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
24e40 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
24e50 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
24e60 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
24e70 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
24e80 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
24e90 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
24ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
24eb0 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
24ec0 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
24ed0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
24ee0 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
24ef0 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
24f00 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
24f10 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
24f20 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
24f30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
24f40 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
24f50 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
24f60 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
24f70 64 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  d = winMbcsToUtf
24f80 38 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41  8(zFilename, osA
24f90 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
24fa0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
24fb0 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
24fc0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
24fd0 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
24fe0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65  zConverted;.}.#e
24ff0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
25000 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
25010 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
25020 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
25030 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
25040 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
25050 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
25060 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
25070 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
25080 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
25090 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
250a0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
250b0 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
250c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
250d0 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d   *winConvertFrom
250e0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
250f0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
25100 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  me){.  void *zCo
25110 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
25120 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
25130 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
25140 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
25150 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
25160 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
25170 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
25180 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
25190 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f  rted = winUtf8To
251a0 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Mbcs(zFilename, 
251b0 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
251c0 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  I());.  }.#endif
251d0 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
251e0 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
251f0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
25200 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
25210 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25220 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
25230 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
25240 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
25250 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
25260 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
25270 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
25280 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20  haracter or one 
25290 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
252a0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e  .** added to it.
252b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
252c0 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
252d0 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  p(int nBuf, char
252e0 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
252f0 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
25300 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
25310 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
25320 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20   if( nLen>0 ){. 
25330 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
25340 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
25350 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
25360 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
25370 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e  lse if( nLen+1<n
25380 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Buf ){.        z
25390 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47  Buf[nLen] = winG
253a0 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20  etDirSep();.    
253b0 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d      zBuf[nLen+1]
253c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
253d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
253e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
253f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
25400 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
25410 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
25420 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
25430 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
25440 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
25450 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
25460 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
25470 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
25480 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
25490 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
254a0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
254b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
254c0 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
254d0 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
254e0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
254f0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
25500 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
25510 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
25520 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
25530 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
25540 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
25550 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Pre = sqlite3Str
25560 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
25570 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
25580 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66    int nMax, nBuf
25590 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20  , nDir, nLen;.  
255a0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f  char *zBuf;..  /
255b0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
255c0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
255d0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
255e0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
255f0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
25600 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
25610 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
25620 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
25630 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
25640 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a  nction failing..
25650 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
25660 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
25670 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
25680 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
25690 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
256a0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75   to store the fu
256b0 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
256c0 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72  le.  ** name for
256d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
256e0 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66 61  ile.  If this fa
256f0 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63  ils, we cannot c
25700 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20  ontinue..  */.  
25710 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50  nMax = pVfs->mxP
25720 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20  athname; nBuf = 
25730 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66  nMax + 2;.  zBuf
25740 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
25750 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20  Zero( nBuf );.  
25760 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20  if( !zBuf ){.   
25770 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
25780 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
25790 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
257a0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
257b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
257c0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
257d0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
257e0 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d 70  e effective temp
257f0 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
25800 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69    First, check i
25810 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62  f one.  ** has b
25820 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73  een explicitly s
25830 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  et by the applic
25840 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65  ation; otherwise
25850 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20  , use the one.  
25860 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
25870 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
25880 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44  ystem..  */.  nD
25890 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72  ir = nMax - (nPr
258a0 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72  e + 15);.  asser
258b0 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69  t( nDir>0 );.  i
258c0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
258d0 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
258e0 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73   int nDirLen = s
258f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
25900 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
25910 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20  ctory);.    if( 
25920 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  nDirLen>0 ){.   
25930 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69 72     if( !winIsDir
25940 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  Sep(sqlite3_temp
25950 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c  _directory[nDirL
25960 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  en-1]) ){.      
25970 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20    nDirLen++;.   
25980 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
25990 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20  DirLen>nDir ){. 
259a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
259b0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
259c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
259d0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
259e0 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
259f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25a00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
25a10 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
25a20 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20  nGetTempname1", 
25a30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
25a40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25a50 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
25a60 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
25a70 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
25a80 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69    }.  }.#if defi
25a90 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
25aa0 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74    else{.    stat
25ab0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
25ac0 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
25ad0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
25ae0 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
25af0 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
25b00 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
25b10 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
25b20 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20  * getenv("TMP") 
25b30 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
25b40 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a  getenv("TEMP") *
25b50 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
25b60 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
25b70 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22  LE") */.       "
25b80 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
25b90 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
25ba0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
25bb0 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20      ".",.       
25bc0 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
25bd0 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
25be0 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e     };.    unsign
25bf0 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f  ed int i;.    co
25c00 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
25c10 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a   0;..    if( !az
25c20 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73  Dirs[0] ) azDirs
25c30 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [0] = getenv("SQ
25c40 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
25c50 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31     if( !azDirs[1
25c60 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
25c70 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
25c80 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
25c90 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d  s[2] ) azDirs[2]
25ca0 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29   = getenv("TMP")
25cb0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
25cc0 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d  s[3] ) azDirs[3]
25cd0 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22   = getenv("TEMP"
25ce0 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
25cf0 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34  rs[4] ) azDirs[4
25d00 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52  ] = getenv("USER
25d10 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66  PROFILE");.    f
25d20 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
25d30 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
25d40 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
25d50 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
25d60 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76       void *zConv
25d70 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28  erted;.      if(
25d80 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
25d90 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66  nue;.      /* If
25da0 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73   the path starts
25db0 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65   with a drive le
25dc0 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  tter followed by
25dd0 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20   the colon.     
25de0 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61   ** character, a
25df0 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65  ssume it is alre
25e00 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e  ady a native Win
25e10 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69  32 path; otherwi
25e20 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  se,.      ** it 
25e30 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65  must be converte
25e40 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69  d to a native Wi
25e50 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65  n32 path via the
25e60 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20   Cygwin API.    
25e70 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73    ** prior to us
25e80 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  ing it..      */
25e90 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
25ea0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
25eb0 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  lon(zDir) ){.   
25ec0 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
25ed0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
25ee0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69  Utf8Filename(zDi
25ef0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
25f00 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
25f10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25f20 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
25f30 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
25f40 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
25f50 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
25f60 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
25f70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25f80 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
25f90 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
25fa0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73         if( winIs
25fb0 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
25fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
25fd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
25fe0 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
25ff0 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20  zDir);.         
26000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
26010 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
26020 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
26040 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
26050 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65  erted);.      }e
26060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
26070 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
26080 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
26090 78 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  x+1 );.        i
260a0 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29  f( !zConverted )
260b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
260c0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
260d0 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
260e0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
260f0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
26100 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
26110 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
26120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
26130 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
26140 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79  }.        if( cy
26150 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
26180 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
26190 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
261a0 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20  _A, zDir,.      
261b0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65            zConve
261c0 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20  rted, nMax+1)<0 
261d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
261e0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
261f0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
26200 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
26210 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
26220 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26230 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26240 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c  _IOERR_CONVPATH\
26250 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
26260 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
26270 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
26280 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
26290 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
262c0 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20  name2", zDir);. 
262d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
262e0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
262f0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
26300 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
26310 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
26320 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64   the candidate d
26330 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20  irectory exists 
26340 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20  and should.     
26350 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e       ** be used.
26360 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61    However, we ma
26370 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72  y need to conver
26380 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e  t the string con
26390 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  taining.        
263a0 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e    ** its name in
263b0 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69  to UTF-8 (i.e. i
263c0 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72  f it is UTF-16 r
263d0 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20  ight now)..     
263e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
263f0 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
26400 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
26410 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72  Filename(zConver
26420 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
26430 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
26440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26450 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26460 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
26470 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
26480 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
26490 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
264a0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
264b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
264c0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
264d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
264e0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
264f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26500 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26510 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
26520 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
26530 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26540 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
26550 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26560 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26570 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
26580 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
26590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
265a0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
265b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
265c0 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45   }.#elif !SQLITE
265d0 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
265e0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
265f0 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49  ).  else if( osI
26600 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
26610 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c  r *zMulti;.    L
26620 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20  PWSTR zWidePath 
26630 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
26640 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66  ero( nMax*sizeof
26650 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69  (WCHAR) );.    i
26660 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b  f( !zWidePath ){
26670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26680 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
26690 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
266a0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
266b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
266c0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
266d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
266e0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
266f0 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
26700 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57  mpPathW(nMax, zW
26710 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  idePath)==0 ){. 
26720 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26730 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
26740 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26750 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
26760 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
26770 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
26780 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
26790 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  H\n"));.      re
267a0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
267b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  (SQLITE_IOERR_GE
267c0 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74  TTEMPPATH, osGet
267d0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
26800 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20  pname2", 0);.   
26810 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20   }.    zMulti = 
26820 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
26830 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
26840 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20   if( zMulti ){. 
26850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
26860 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
26870 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
26880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26890 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
268a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
268b0 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
268c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
268d0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
268e0 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
268f0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
26900 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
26910 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
26920 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
26930 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
26940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26950 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
26960 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
26970 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
26980 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
26990 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
269a0 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50      char *zMbcsP
269b0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
269c0 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b  locZero( nMax );
269d0 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50  .    if( !zMbcsP
269e0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
269f0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
26a00 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
26a10 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
26a20 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26a30 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
26a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26a50 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
26a60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
26a70 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d  sGetTempPathA(nM
26a80 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d  ax, zMbcsPath)==
26a90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26aa0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
26ab0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
26ac0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
26ad0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
26ae0 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
26af0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
26b00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
26b10 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
26b20 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
26b30 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
26b50 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20  nGetTempname3", 
26b60 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  0);.    }.    zU
26b70 74 66 38 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  tf8 = winMbcsToU
26b80 74 66 38 28 7a 4d 62 63 73 50 61 74 68 2c 20 6f  tf8(zMbcsPath, o
26b90 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
26ba0 28 29 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  ());.    if( zUt
26bb0 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
26bc0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
26bd0 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
26be0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
26bf0 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
26c00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26c10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26c20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
26c30 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
26c40 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
26c50 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
26c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26c70 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
26c80 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
26c90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
26ca0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
26cb0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53   */.#endif /* !S
26cc0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
26cd0 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  /..  /*.  ** Che
26ce0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
26cf0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
26d00 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74  rectory ends wit
26d10 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  h an appropriate
26d20 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e  .  ** separator.
26d30 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
26d40 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
26d50 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c  t enough space l
26d60 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20  eft to add.  ** 
26d70 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a  one, fail..  */.
26d80 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e    if( !winMakeEn
26d90 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31  dInDirSep(nDir+1
26da0 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73  , zBuf) ){.    s
26db0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
26dc0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
26dd0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
26de0 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
26df0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
26e00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
26e10 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
26e20 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20  nGetTempname4", 
26e30 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  0);.  }..  /*.  
26e40 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
26e50 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
26e60 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
26e70 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
26e80 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65  y file.  ** name
26e90 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
26ea0 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20  g format:.  **. 
26eb0 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72   **   "<temporar
26ec0 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69  y_directory>/eti
26ed0 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58  lqs_XXXXXXXXXXXX
26ee0 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20  XXX\0\0".  **.  
26ef0 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  ** If not, retur
26f00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
26f10 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69   The number 17 i
26f20 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f  s used here in o
26f30 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63  rder to.  ** acc
26f40 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61  ount for the spa
26f50 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31  ce used by the 1
26f60 35 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64  5 character rand
26f70 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68  om suffix and th
26f80 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c  e.  ** two trail
26f90 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ing NUL characte
26fa0 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64  rs.  The final d
26fb0 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
26fc0 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a  or character.  *
26fd0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64  * has already ad
26fe0 64 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f  ded if it was no
26ff0 74 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  t already presen
27000 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d  t..  */.  nLen =
27010 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
27020 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e  (zBuf);.  if( (n
27030 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29  Len + nPre + 17)
27040 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73   > nBuf ){.    s
27050 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
27060 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
27070 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
27080 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e  c=SQLITE_ERROR\n
27090 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
270a0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
270b0 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
270c0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20  nGetTempname5", 
270d0 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  0);.  }..  sqlit
270e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
270f0 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e  -16-nLen, zBuf+n
27100 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50  Len, SQLITE_TEMP
27110 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a  _FILE_PREFIX);..
27120 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
27130 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
27140 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
27150 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
27160 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35  .  for(i=0; i<15
27170 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
27180 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
27190 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
271a0 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
271b0 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
271c0 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
271d0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75  uf[j] = 0;.  zBu
271e0 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70  f[j+1] = 0;.  *p
271f0 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20  zBuf = zBuf;..  
27200 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
27210 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c  ILENAME name=%s,
27220 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
27230 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75  , zBuf));.  retu
27240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27250 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
27260 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
27270 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  file is really a
27280 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74   directory.  Ret
27290 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20  urn false if.** 
272a0 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  it is something 
272b0 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72  other than a dir
272c0 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68  ectory, or if th
272d0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
272e0 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c  of memory.** all
272f0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e  ocation failure.
27300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27310 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
27320 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b  id *zConverted){
27330 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
27340 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
27350 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
27360 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
27370 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
27380 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
27390 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
273a0 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
273b0 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
273c0 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
273d0 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
273e0 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
273f0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
27400 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
27410 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27430 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
27440 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27460 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
27470 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
27480 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
27490 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
274a0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
274b0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
274c0 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f  Invalid name? */
274d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20  .    }.    attr 
274e0 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
274f0 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69  leAttributes;.#i
27500 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
27510 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
27520 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
27530 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
27540 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
27550 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
27560 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56  eturn (attr!=INV
27570 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
27580 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46  UTES) && (attr&F
27590 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
275a0 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 20  RECTORY);.}../* 
275b0 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  forward referenc
275c0 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
275d0 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c  winAccess(.  sql
275e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
275f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
27600 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
27610 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
27620 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
27630 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
27640 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
27650 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
27660 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
27670 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e   test to make on
27680 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
27690 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
276a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
276b0 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 3b 0a  T: Result */.);.
276c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
276d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
276e0 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c  t winOpen(.  sql
276f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
27700 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
27710 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61  o get maximum pa
27720 74 68 20 6c 65 6e 67 74 68 20 61 6e 64 20 41 70  th length and Ap
27730 70 44 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74  pData */.  const
27740 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
27750 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27760 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
27770 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
27780 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
27790 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
277a0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
277b0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
277c0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
277d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65      /* Open mode
277e0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
277f0 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
27800 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
27810 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a  return flags */.
27820 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
27830 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
27840 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77   = 0;.  DWORD dw
27850 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20  DesiredAccess;. 
27860 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f   DWORD dwShareMo
27870 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72  de;.  DWORD dwCr
27880 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
27890 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  n;.  DWORD dwFla
278a0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
278b0 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  = 0;.#if SQLITE_
278c0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69  OS_WINCE.  int i
278d0 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69  sTemp = 0;.#endi
278e0 66 0a 20 20 77 69 6e 56 66 73 41 70 70 44 61 74  f.  winVfsAppDat
278f0 61 20 2a 70 41 70 70 44 61 74 61 3b 0a 20 20 77  a *pAppData;.  w
27900 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
27910 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
27920 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
27930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27940 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
27950 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
27960 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
27970 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
27980 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
27990 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
279a0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
279b0 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
279c0 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
279d0 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
279e0 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
279f0 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
27a00 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
27a10 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
27a20 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
27a30 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
27a40 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61  /.  char *zTmpna
27a50 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74  me = 0; /* For t
27a60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
27a70 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  e, if necessary.
27a80 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
27a90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
27aa0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
27ab0 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
27ac0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
27ad0 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
27ae0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
27af0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
27b00 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
27b10 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
27b20 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
27b30 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
27b40 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
27b50 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
27b60 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
27b70 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
27b80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
27b90 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
27ba0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
27bb0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
27bc0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
27bd0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
27be0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
27bf0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
27c00 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
27c10 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
27c20 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
27c30 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
27c40 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
27c50 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
27c60 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
27c70 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
27c80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
27c90 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c  R_JOURNAL.     |
27ca0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
27cb0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
27cc0 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  L.     || eType=
27cd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
27ce0 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
27cf0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
27d00 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
27d10 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
27d20 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
27d30 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
27d40 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
27d50 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
27d60 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
27d70 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
27d80 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a   are true:.  **.
27d90 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
27da0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
27db0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
27dc0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
27dd0 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
27de0 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
27df0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
27e00 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
27e10 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
27e20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
27e30 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
27e40 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
27e50 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
27e60 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
27e70 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
27e80 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
27e90 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
27ea0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
27eb0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
27ec0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
27ed0 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
27ee0 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
27ef0 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
27f00 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
27f10 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
27f20 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
27f30 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
27f40 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
27f50 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
27f60 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
27f70 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
27f80 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
27f90 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
27fa0 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ever.  ** automa
27fb0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
27fc0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
27fd0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
27fe0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
27ff0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
28000 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
28010 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
28020 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
28030 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
28040 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
28050 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
28060 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
28070 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
28080 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
28090 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
280a0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
280b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
280c0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
280d0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
280e0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
280f0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
28100 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
28110 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
28120 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
28130 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
28140 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
28150 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
28160 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
28170 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
28180 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  DB.       || eTy
28190 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
281a0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
281b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
281c0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a  EN_TEMP_JOURNAL.
281d0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
281e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
281f0 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
28200 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
28210 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20  MASTER_JOURNAL. 
28220 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
28230 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
28240 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
28250 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
28260 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
28270 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
28280 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
28290 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65  , sizeof(winFile
282a0 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ));.  pFile->h =
282b0 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
282c0 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49  VALUE;..#if SQLI
282d0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
282e0 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20  ( !zUtf8Name && 
282f0 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  !sqlite3_temp_di
28300 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
28310 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
28320 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20  E_ERROR,.       
28330 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   "sqlite3_temp_d
28340 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c  irectory variabl
28350 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  e should be set 
28360 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d  for WinRT");.  }
28370 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
28380 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
28390 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
283a0 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
283b0 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74  enerate a.  ** t
283c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
283d0 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20  me to use.  */. 
283e0 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
283f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
28400 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
28410 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  enJournal );.   
28420 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
28430 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70  name(pVfs, &zTmp
28440 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
28450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28460 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
28470 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
28480 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  =%s", zUtf8Name,
28490 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
284a0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
284b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
284c0 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
284d0 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
284e0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
284f0 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
28500 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
28510 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
28520 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
28530 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
28540 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
28550 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
28560 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75  o.  ** sqlite3_u
28570 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a  ri_parameter()..
28580 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
28590 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
285a0 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28  EN_MAIN_DB) || (
285b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
285c0 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20  PEN_URI) ||.    
285d0 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c     zUtf8Name[sql
285e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74  ite3Strlen30(zUt
285f0 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  f8Name)+1]==0 );
28600 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
28610 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
28620 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
28630 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
28640 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
28650 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
28660 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
28670 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
28680 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
28690 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
286a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
286b0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
286c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
286d0 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  M", zUtf8Name));
286e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
286f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
28700 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  KPT;.  }..  if( 
28710 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
28720 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ted) ){.    sqli
28730 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28740 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
28750 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
28760 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
28770 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
28780 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
28790 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61  _ISDIR", zUtf8Na
287a0 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
287b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
287c0 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ISDIR;.  }..  i
287d0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
287e0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
287f0 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
28800 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
28810 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
28820 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
28830 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
28840 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c  D;.  }..  /* SQL
28850 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
28860 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  VE is used to ma
28870 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e  ke sure that a n
28880 65 77 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20  ew file is.  ** 
28890 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20  created. SQLite 
288a0 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74  doesn't use it t
288b0 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c  o indicate "excl
288c0 75 73 69 76 65 20 61 63 63 65 73 73 22 0a 20 20  usive access".  
288d0 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61  ** as it is usua
288e0 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a  lly understood..
288f0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63    */.  if( isExc
28900 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
28910 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66   Creates a new f
28920 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
28930 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
28940 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f   exist. */.    /
28950 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78  * If the file ex
28960 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20  ists, it fails. 
28970 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
28980 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43  nDisposition = C
28990 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c  REATE_NEW;.  }el
289a0 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20  se if( isCreate 
289b0 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65  ){.    /* Open e
289c0 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72  xisting file, or
289d0 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f   create if it do
289e0 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20  esn't exist */. 
289f0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
28a00 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
28a10 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
28a20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20  .    /* Opens a 
28a30 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
28a40 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
28a50 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
28a60 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49  ition = OPEN_EXI
28a70 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77  STING;.  }..  dw
28a80 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45  ShareMode = FILE
28a90 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
28aa0 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a  LE_SHARE_WRITE;.
28ab0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
28ac0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
28ad0 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61  _WINCE.    dwFla
28ae0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
28af0 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
28b00 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54  _HIDDEN;.    isT
28b10 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  emp = 1;.#else. 
28b20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
28b30 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
28b40 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
28b50 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55    | FILE_ATTRIBU
28b80 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20  TE_HIDDEN.      
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
28bb0 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
28bc0 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  LOSE;.#endif.  }
28bd0 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67  else{.    dwFlag
28be0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
28bf0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
28c00 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
28c10 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68   Reports from th
28c20 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74  e internet are t
28c30 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  hat performance 
28c40 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62  is always.  ** b
28c50 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c  etter if FILE_FL
28c60 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
28c70 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65   is used.  Ticke
28c80 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20  t #2699. */.#if 
28c90 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
28ca0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
28cb0 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
28cc0 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
28cd0 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  S;.#endif..  if(
28ce0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
28cf0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
28d00 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32  .    CREATEFILE2
28d10 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
28d20 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72  TERS extendedPar
28d30 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74  ameters;.    ext
28d40 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
28d50 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  dwSize = sizeof(
28d60 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
28d70 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
28d80 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
28d90 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41  rameters.dwFileA
28da0 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20  ttributes =.    
28db0 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
28dc0 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
28dd0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
28de0 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
28df0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
28e00 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73  eFlags = dwFlags
28e10 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
28e20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a  FILE_FLAG_MASK;.
28e30 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
28e40 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74  meters.dwSecurit
28e50 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55  yQosFlags = SECU
28e60 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a  RITY_ANONYMOUS;.
28e70 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
28e80 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74  meters.lpSecurit
28e90 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55  yAttributes = NU
28ea0 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  LL;.    extended
28eb0 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70  Parameters.hTemp
28ec0 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  lateFile = NULL;
28ed0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 68  .    do{.      h
28ee0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32   = osCreateFile2
28ef0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
28f00 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
28f20 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
28f50 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
28f60 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
28f70 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
28f80 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
28f90 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65             &exte
28fa0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 3b  ndedParameters);
28fb0 0a 20 20 20 20 20 20 69 66 28 20 68 21 3d 49 4e  .      if( h!=IN
28fc0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
28fd0 55 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  UE ) break;.    
28fe0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
28ff0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
29000 20 72 63 32 2c 20 69 73 52 4f 20 3d 20 30 3b 0a   rc2, isRO = 0;.
29010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
29020 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
29030 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 32 20  ();.        rc2 
29040 3d 20 77 69 6e 41 63 63 65 73 73 28 70 56 66 73  = winAccess(pVfs
29050 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
29060 41 43 43 45 53 53 5f 52 45 41 44 2c 20 26 69 73  ACCESS_READ, &is
29070 52 4f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  RO);.        sql
29080 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
29090 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
290a0 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
290b0 4b 20 26 26 20 69 73 52 4f 20 29 20 62 72 65 61  K && isRO ) brea
290c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
290d0 77 68 69 6c 65 28 20 77 69 6e 52 65 74 72 79 49  while( winRetryI
290e0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
290f0 45 72 72 6e 6f 29 20 29 3b 0a 23 65 6c 73 65 0a  Errno) );.#else.
29100 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 68 20      do{.      h 
29110 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28  = osCreateFileW(
29120 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
29130 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
29150 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
29180 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
291b0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
291e0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
29200 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  LL);.      if( h
29210 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
29220 5f 56 41 4c 55 45 20 29 20 62 72 65 61 6b 3b 0a  _VALUE ) break;.
29230 20 20 20 20 20 20 69 66 28 20 69 73 52 65 61 64        if( isRead
29240 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
29250 20 69 6e 74 20 72 63 32 2c 20 69 73 52 4f 20 3d   int rc2, isRO =
29260 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
29270 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
29280 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
29290 72 63 32 20 3d 20 77 69 6e 41 63 63 65 73 73 28  rc2 = winAccess(
292a0 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  pVfs, zName, SQL
292b0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 2c  ITE_ACCESS_READ,
292c0 20 26 69 73 52 4f 29 3b 0a 20 20 20 20 20 20 20   &isRO);.       
292d0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
292e0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
292f0 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
29300 54 45 5f 4f 4b 20 26 26 20 69 73 52 4f 20 29 20  TE_OK && isRO ) 
29310 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
29320 20 20 20 7d 77 68 69 6c 65 28 20 77 69 6e 52 65     }while( winRe
29330 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
29340 6c 61 73 74 45 72 72 6e 6f 29 20 29 3b 0a 23 65  lastErrno) );.#e
29350 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
29360 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
29370 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
29380 20 20 64 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20    do{.      h = 
29390 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c  osCreateFileA((L
293a0 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  PCSTR)zConverted
293b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
293c0 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
293d0 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293f0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
29400 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
29420 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
29430 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
29450 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
29460 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
29470 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
29480 3b 0a 20 20 20 20 20 20 69 66 28 20 68 21 3d 49  ;.      if( h!=I
29490 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
294a0 4c 55 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LUE ) break;.   
294b0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
294c0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
294d0 74 20 72 63 32 2c 20 69 73 52 4f 20 3d 20 30 3b  t rc2, isRO = 0;
294e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
294f0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
29500 63 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 32  c();.        rc2
29510 20 3d 20 77 69 6e 41 63 63 65 73 73 28 70 56 66   = winAccess(pVf
29520 73 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  s, zName, SQLITE
29530 5f 41 43 43 45 53 53 5f 52 45 41 44 2c 20 26 69  _ACCESS_READ, &i
29540 73 52 4f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sRO);.        sq
29550 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
29560 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
29570 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
29580 4f 4b 20 26 26 20 69 73 52 4f 20 29 20 62 72 65  OK && isRO ) bre
29590 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
295a0 7d 77 68 69 6c 65 28 20 77 69 6e 52 65 74 72 79  }while( winRetry
295b0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
295c0 74 45 72 72 6e 6f 29 20 29 3b 0a 20 20 7d 0a 23  tErrno) );.  }.#
295d0 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f  endif.  winLogIo
295e0 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
295f0 5f 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  _);..  OSTRACE((
29600 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
29610 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
29620 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c  lx, rc=%s\n", h,
29630 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20   zUtf8Name,.    
29640 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
29650 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41  Access, (h==INVA
29660 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
29670 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
29680 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d  ok"));..  if( h=
29690 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
296a0 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 73 71 6c  VALUE ){.    sql
296b0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
296c0 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
296d0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
296e0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  );.    if( isRea
296f0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
29700 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
29710 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70  return winOpen(p
29720 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a  Vfs, zName, id,.
29730 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
29740 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
29750 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20  DONLY) &.       
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28                ~(
29770 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
29780 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
29790 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20  EADWRITE)),.    
297a0 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b       pOutFlags);
297b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
297c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
297d0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
297e0 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
297f0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
29800 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  N, pFile->lastEr
29810 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20  rno, "winOpen", 
29820 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20  zUtf8Name);.    
29830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29840 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
29850 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
29860 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
29870 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
29880 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
29890 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
298a0 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
298b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
298c0 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
298d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
298e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f  ;.    }.  }..  O
298f0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69  STRACE(("OPEN fi
29900 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20  le=%p, name=%s, 
29910 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74  access=%lx, pOut
29920 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46  Flags=%p, *pOutF
29930 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20  lags=%d, ".     
29940 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c        "rc=%s\n",
29950 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64   h, zUtf8Name, d
29960 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
29970 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46  pOutFlags, pOutF
29980 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20  lags ?.         
29990 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30    *pOutFlags : 0
299a0 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
299b0 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
299c0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
299d0 0a 0a 20 20 70 41 70 70 44 61 74 61 20 3d 20 28  ..  pAppData = (
299e0 77 69 6e 56 66 73 41 70 70 44 61 74 61 2a 29 70  winVfsAppData*)p
299f0 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 0a  Vfs->pAppData;..
29a00 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
29a10 4e 43 45 0a 20 20 7b 0a 20 20 20 20 69 66 28 20  NCE.  {.    if( 
29a20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65  isReadWrite && e
29a30 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
29a40 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20  N_MAIN_DB.      
29a50 20 20 20 26 26 20 28 28 70 41 70 70 44 61 74 61     && ((pAppData
29a60 3d 3d 4e 55 4c 4c 29 20 7c 7c 20 21 70 41 70 70  ==NULL) || !pApp
29a70 44 61 74 61 2d 3e 62 4e 6f 4c 6f 63 6b 29 0a 20  Data->bNoLock). 
29a80 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
29a90 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
29aa0 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21  (zName, pFile))!
29ab0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 29  =SQLITE_OK.    )
29ac0 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
29ad0 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 20 20  andle(h);.      
29ae0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
29af0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
29b00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
29b10 70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53  pname);.      OS
29b20 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d  TRACE(("OPEN-CE-
29b30 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LOCK name=%s, rc
29b40 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73  =%s\n", zName, s
29b50 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
29b60 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
29b70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
29b80 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
29b90 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
29ba0 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
29bb0 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
29bc0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
29bd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
29be0 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
29bf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
29c00 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  pname);.  pFile-
29c10 3e 70 4d 65 74 68 6f 64 20 3d 20 70 41 70 70 44  >pMethod = pAppD
29c20 61 74 61 20 3f 20 70 41 70 70 44 61 74 61 2d 3e  ata ? pAppData->
29c30 70 4d 65 74 68 6f 64 20 3a 20 26 77 69 6e 49 6f  pMethod : &winIo
29c40 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d  Method;.  pFile-
29c50 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
29c60 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20  pFile->h = h;.  
29c70 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
29c80 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
29c90 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
29ca0 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  E_RDONLY;.  }.  
29cb0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
29cc0 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22  boolean(zName, "
29cd0 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
29ce0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
29cf0 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
29d00 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
29d10 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  NFILE_PSOW;.  }.
29d20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
29d30 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
29d40 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
29d50 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54  zName;.#if SQLIT
29d60 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
29d70 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20  0.  pFile->hMap 
29d80 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d  = NULL;.  pFile-
29d90 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
29da0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
29db0 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  ze = 0;.  pFile-
29dc0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73  >mmapSizeMax = s
29dd0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
29de0 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69  ig.szMmap;.#endi
29df0 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  f..  OpenCounter
29e00 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (+1);.  return r
29e10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
29e20 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
29e30 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
29e40 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20  at Windows does 
29e50 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65  not allow a file
29e60 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
29e70 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  f some other.** 
29e80 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f  process has it o
29e90 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  pen.  Sometimes 
29ea0 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20  a virus scanner 
29eb0 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67  or indexing prog
29ec0 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e  ram.** will open
29ed0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
29ee0 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74  shortly after it
29ef0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f   is created in o
29f00 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68  rder to do.** wh
29f10 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20  atever it does. 
29f20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65   While this othe
29f30 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
29f40 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
29f50 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62   open, we will b
29f60 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65  e unable to dele
29f70 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20  te it.  To work 
29f80 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70  around this.** p
29f90 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79  roblem, we delay
29fa0 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
29fb0 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c  s and try to del
29fc0 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a  ete again.  Up.*
29fd0 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  * to MX_DELETION
29fe0 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69  _ATTEMPTs deleti
29ff0 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  on attempts are 
2a000 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e  run before givin
2a010 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75  g.** up and retu
2a020 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
2a030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2a040 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  nDelete(.  sqlit
2a050 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2a060 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
2a070 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
2a080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2a090 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  lename,      /* 
2a0a0 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
2a0b0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
2a0c0 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20  syncDir         
2a0d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
2a0e0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
2a0f0 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
2a100 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  ;.  int rc;.  DW
2a110 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52  ORD attr;.  DWOR
2a120 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
2a130 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
2a140 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
2a150 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2a160 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a170 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53  R(syncDir);..  S
2a180 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
2a190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2a1a0 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53  RR_DELETE);.  OS
2a1b0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e  TRACE(("DELETE n
2a1c0 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d  ame=%s, syncDir=
2a1d0 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %d\n", zFilename
2a1e0 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20  , syncDir));..  
2a1f0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
2a200 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
2a210 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
2a220 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
2a230 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
2a240 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
2a250 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
2a260 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
2a270 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  ", zFilename));.
2a280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a290 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2a2a0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  PT;.  }.  if( os
2a2b0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  IsNT() ){.    do
2a2c0 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   {.#if SQLITE_OS
2a2d0 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e  _WINRT.      WIN
2a2e0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
2a2f0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
2a300 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
2a310 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
2a320 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
2a330 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47  ;.      if ( osG
2a340 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
2a350 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ExW(zConverted, 
2a360 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
2a370 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
2a3a0 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ata) ){.        
2a3b0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
2a3c0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
2a3d0 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  s;.      }else{.
2a3e0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
2a3f0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
2a400 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
2a410 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
2a420 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
2a430 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
2a440 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
2a450 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
2a460 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2a480 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
2a490 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
2a4a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a4b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a4c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2a4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
2a4e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  ak;.      }.#els
2a4f0 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  e.      attr = o
2a500 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
2a510 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esW(zConverted);
2a520 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2a530 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
2a540 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
2a550 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
2a560 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
2a570 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
2a580 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
2a590 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
2a5a0 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
2a5b0 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
2a5c0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
2a5d0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
2a5e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2a5f0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
2a600 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
2a610 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
2a620 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2a630 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2a640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a650 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a660 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
2a670 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
2a680 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
2a690 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a6a0 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
2a6b0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
2a6c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a6d0 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
2a6e0 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72  eteFileW(zConver
2a6f0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
2a700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2a710 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
2a720 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
2a730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a740 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
2a750 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
2a760 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
2a770 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2a780 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
2a790 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
2a7a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a7b0 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
2a7c0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
2a7d0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
2a7e0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f  I.  else{.    do
2a7f0 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20   {.      attr = 
2a800 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
2a810 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
2a820 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  ;.      if ( att
2a830 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
2a840 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
2a850 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
2a860 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
2a870 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
2a880 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
2a890 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
2a8a0 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
2a8b0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
2a8c0 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
2a8d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2a8e0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2a8f0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
2a900 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
2a910 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a920 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a930 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2a940 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
2a950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a960 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
2a970 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
2a980 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
2a990 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2a9a0 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
2a9b0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
2a9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a9d0 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
2a9e0 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eA(zConverted) )
2a9f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2aa00 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
2aa10 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
2aa20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2aa30 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
2aa40 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
2aa50 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
2aa60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2aa70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
2aa80 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
2aa90 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
2aaa0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2aab0 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
2aac0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 26  endif.  if( rc &
2aad0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
2aae0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
2aaf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
2ab00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
2ab10 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73  OERR_DELETE, las
2ab20 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65  tErrno, "winDele
2ab30 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  te", zFilename);
2ab40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69  .  }else{.    wi
2ab50 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f  nLogIoerr(cnt, _
2ab60 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20  _LINE__);.  }.  
2ab70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2ab80 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
2ab90 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
2aba0 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
2abb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
2abc0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
2abd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2abe0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
2abf0 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73   existence and s
2ac00 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e  tatus of a file.
2ac10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2ac20 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  inAccess(.  sqli
2ac30 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2ac40 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
2ac50 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
2ac60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2ac70 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  lename,     /* N
2ac80 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63  ame of file to c
2ac90 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  heck */.  int fl
2aca0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2acb0 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
2acc0 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
2acd0 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2ace0 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
2acf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2ad00 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20  : Result */.){. 
2ad10 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
2ad20 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
2ad30 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
2ad40 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
2ad50 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
2ad60 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2ad70 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2ad80 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2ad90 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
2ada0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  );.  OSTRACE(("A
2adb0 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66  CCESS name=%s, f
2adc0 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74  lags=%x, pResOut
2add0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
2ade0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c     zFilename, fl
2adf0 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ags, pResOut));.
2ae00 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
2ae10 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2ae20 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
2ae30 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
2ae40 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
2ae50 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
2ae60 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  SS name=%s, rc=S
2ae70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
2ae80 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  M\n", zFilename)
2ae90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2aea0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2aeb0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
2aec0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
2aed0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
2aee0 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
2aef0 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
2af00 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
2af10 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
2af20 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
2af30 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
2af40 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
2af50 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
2af60 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
2af70 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
2afa0 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
2afd0 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72   && winRetryIoer
2afe0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
2aff0 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
2b000 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  rc ){.      /* F
2b010 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43  or an SQLITE_ACC
2b020 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79  ESS_EXISTS query
2b030 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c  , treat a zero-l
2b040 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20  ength file.     
2b050 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65   ** as if it doe
2b060 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
2b070 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2b080 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45     flags==SQLITE
2b090 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20  _ACCESS_EXISTS. 
2b0a0 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
2b0b0 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48  rData.nFileSizeH
2b0c0 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  igh==0.         
2b0d0 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
2b0e0 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b  ileSizeLow==0 ){
2b0f0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
2b100 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
2b110 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
2b120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
2b130 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
2b140 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
2b150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2b160 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  se{.      winLog
2b170 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e  Ioerr(cnt, __LIN
2b180 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  E__);.      if( 
2b190 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
2b1a0 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _FILE_NOT_FOUND 
2b1b0 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  && lastErrno!=ER
2b1c0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
2b1d0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ND ){.        sq
2b1e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2b1f0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
2b200 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2b210 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2b220 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e  ACCESS, lastErrn
2b230 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a  o, "winAccess",.
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b250 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
2b260 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
2b270 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
2b280 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
2b290 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
2b2a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
2b2b0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
2b2c0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
2b2d0 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
2b2e0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2b2f0 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
2b300 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
2b310 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
2b320 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2b330 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
2b340 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2b350 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
2b360 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2b370 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
2b380 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
2b390 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
2b3a0 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65  BUTES;.      bre
2b3b0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2b3c0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2b3d0 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d  RITE:.      rc =
2b3e0 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
2b3f0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
2b400 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
2b410 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
2b420 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
2b430 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
2b440 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2b450 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
2b460 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
2b470 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
2b480 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53  esOut = rc;.  OS
2b490 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
2b4a0 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d  ame=%s, pResOut=
2b4b0 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
2b4c0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
2b4d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
2b4e0 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c  lename, pResOut,
2b4f0 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72   *pResOut));.  r
2b500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2b520 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2b530 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2b540 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
2b550 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72  h a drive letter
2b560 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  .** followed by 
2b570 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65  a colon characte
2b580 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  r..*/.static BOO
2b590 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  L winIsDriveLett
2b5a0 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f  erAndColon(.  co
2b5b0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  nst char *zPathn
2b5c0 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  ame.){.  return 
2b5d0 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  ( sqlite3Isalpha
2b5e0 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26  (zPathname[0]) &
2b5f0 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d  & zPathname[1]==
2b600 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ':' );.}../*.** 
2b610 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
2b620 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
2b630 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  d path name shou
2b640 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61  ld be used verba
2b650 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d  tim.  If.** non-
2b660 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
2b670 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
2b680 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ion, the calling
2b690 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73   function must s
2b6a0 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65  imply.** use the
2b6b0 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e   provided path n
2b6c0 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52  ame verbatim -OR
2b6d0 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74  - resolve it int
2b6e0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61  o a full path na
2b6f0 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  me.** using the 
2b700 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20  GetFullPathName 
2b710 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69  Win32 API functi
2b720 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  on (if available
2b730 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  )..*/.static BOO
2b740 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50  L winIsVerbatimP
2b750 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  athname(.  const
2b760 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2b770 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  .){.  /*.  ** If
2b780 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
2b790 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72  tarts with a for
2b7a0 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20  ward slash or a 
2b7b0 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73  backslash, it is
2b7c0 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c   either.  ** a l
2b7d0 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61  egal UNC name, a
2b7e0 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
2b7f0 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73   path, or an abs
2b800 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20  olute path name 
2b810 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69  in the.  ** "Uni
2b820 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e  x" format on Win
2b830 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  dows.  There is 
2b840 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64  no easy way to d
2b850 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74  ifferentiate bet
2b860 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69  ween.  ** the fi
2b870 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74  nal two cases; t
2b880 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74  herefore, we ret
2b890 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65  urn the safer re
2b8a0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52  turn value of TR
2b8b0 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  UE.  ** so that 
2b8c0 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  callers of this 
2b8d0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69  function will si
2b8e0 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62  mply use it verb
2b8f0 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  atim..  */.  if 
2b900 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50  ( winIsDirSep(zP
2b910 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20  athname[0]) ){. 
2b920 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
2b930 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
2b940 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
2b950 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65  starts with a le
2b960 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e  tter and a colon
2b970 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20   it is either a 
2b980 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61  volume.  ** rela
2b990 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20  tive path or an 
2b9a0 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20  absolute path.  
2b9b0 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  Callers of this 
2b9c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f  function must no
2b9d0 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74  t.  ** attempt t
2b9e0 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20  o treat it as a 
2b9f0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2ba00 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68  me (i.e. they sh
2ba10 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a  ould simply use.
2ba20 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d    ** it verbatim
2ba30 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  )..  */.  if ( w
2ba40 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
2ba50 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d  ndColon(zPathnam
2ba60 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2ba70 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
2ba80 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20  .  ** If we get 
2ba90 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
2baa0 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  he path name sho
2bab0 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61  uld almost certa
2bac0 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79  inly be a purely
2bad0 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f  .  ** relative o
2bae0 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55  ne (i.e. not a U
2baf0 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73  NC name, not abs
2bb00 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76  olute, and not v
2bb10 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e  olume relative).
2bb20 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46  .  */.  return F
2bb30 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALSE;.}../*.** T
2bb40 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
2bb50 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
2bb60 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57  ull pathname.  W
2bb70 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a  rite the full.**
2bb80 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a   pathname into z
2bb90 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77  Out[].  zOut[] w
2bba0 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20  ill be at least 
2bbb0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2bbc0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
2bbd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2bbe0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2bbf0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2bc00 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2bc10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2bc20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2bc30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
2bc40 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a  ative,        /*
2bc50 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
2bc60 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
2bc70 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20  .  int nFull,   
2bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
2bca0 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
2bcb0 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
2bcc0 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ull             
2bcd0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2bce0 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66  buffer */.){.#if
2bcf0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
2bd00 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
2bd10 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
2bd20 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2bd30 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76  DWORD nByte;.  v
2bd40 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
2bd50 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 23  .  char *zOut;.#
2bd60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2bd70 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
2bd80 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
2bd90 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
2bda0 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
2bdb0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
2bdc0 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
2bdd0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
2bde0 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
2bdf0 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
2be00 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69  ='/' && winIsDri
2be10 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
2be20 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b  (zRelative+1) ){
2be30 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
2be40 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e  ;.  }..#if defin
2be50 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
2be60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2be70 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2be80 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45  ERROR );.  UNUSE
2be90 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
2bea0 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  l);.  assert( nF
2beb0 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74  ull>=pVfs->mxPat
2bec0 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20  hname );.  if ( 
2bed0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
2bee0 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
2bef0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
2bf00 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
2bf10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
2bf20 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
2bf30 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
2bf40 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
2bf50 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
2bf60 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2bf70 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
2bf80 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
2bf90 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
2bfa0 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
2bfb0 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
2bfc0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
2bfd0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
2bfe0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
2bff0 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
2c000 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
2c010 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20  y and a slash.. 
2c020 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
2c030 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  zOut = sqlite3Ma
2c040 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e  llocZero( pVfs->
2c050 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a  mxPathname+1 );.
2c060 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b      if( !zOut ){
2c070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c080 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2c090 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2c0a0 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
2c0b0 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
2c0c0 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43     (osIsNT() ? C
2c0d0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
2c0e0 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
2c0f0 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20  _WIN_A) |.      
2c100 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49        CCP_RELATI
2c110 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a  VE, zRelative, z
2c120 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
2c130 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
2c140 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c150 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
2c160 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2c170 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2c180 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
2c190 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
2c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1b0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
2c1c0 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me1", zRelative)
2c1d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c1e0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
2c1f0 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
2c200 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
2c210 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
2c220 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
2c230 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2c240 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c250 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2c260 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
2c270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2c280 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2c290 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2c2a0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2c2b0 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
2c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c2d0 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2c2e0 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53  tory, winGetDirS
2c2f0 65 70 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20  ep(), zUtf8);.  
2c300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c310 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73  (zUtf8);.      s
2c320 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2c330 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2c340 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74  {.    char *zOut
2c350 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2c360 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61  Zero( pVfs->mxPa
2c370 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20  thname+1 );.    
2c380 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20  if( !zOut ){.   
2c390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c3a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2c3b0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2c3c0 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
2c3d0 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  h(.            (
2c3e0 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
2c3f0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
2c400 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
2c410 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _A),.           
2c420 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
2c430 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
2c440 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
2c450 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
2c460 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
2c470 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
2c480 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
2c490 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
2c4a0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2c4c0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
2c4d0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
2c4e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c4f0 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
2c500 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
2c510 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
2c520 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
2c530 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c540 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
2c550 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c560 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2c570 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
2c580 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2c590 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2c5a0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2c5b0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
2c5c0 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
2c5d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
2c5e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c5f0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
2c600 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2c610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
2c620 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f  f..#if (SQLITE_O
2c630 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
2c640 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21  E_OS_WINRT) && !
2c650 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
2c660 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
2c670 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2c680 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
2c690 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
2c6a0 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
2c6b0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
2c6c0 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
2c6d0 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68   */.  /* WinRT h
2c6e0 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e  as no way to con
2c6f0 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20  vert a relative 
2c700 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c  path to an absol
2c710 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66  ute one. */.  if
2c720 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
2c730 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
2c740 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
2c750 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
2c760 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2c770 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
2c780 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
2c790 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
2c7a0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
2c7b0 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
2c7c0 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
2c7d0 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
2c7e0 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
2c7f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
2c800 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
2c810 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
2c820 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
2c830 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
2c840 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
2c850 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
2c860 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
2c870 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
2c880 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c890 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2c8a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2c8b0 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
2c8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
2c8e0 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
2c8f0 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52  nGetDirSep(), zR
2c900 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73  elative);.  }els
2c910 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
2c920 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2c930 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2c940 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2c950 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
2c960 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2c970 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
2c980 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2c990 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
2c9a0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
2c9b0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
2c9c0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
2c9d0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
2c9e0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
2c9f0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
2ca00 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
2ca10 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
2ca20 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
2ca30 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
2ca40 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
2ca50 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
2ca60 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
2ca70 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
2ca80 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
2ca90 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
2caa0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
2cab0 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
2cac0 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
2cad0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2cae0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
2caf0 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
2cb00 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2cb10 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
2cb20 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
2cb30 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
2cb40 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
2cb50 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2cb60 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
2cb70 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
2cb80 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
2cb90 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2cba0 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
2cbb0 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
2cbc0 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
2cbd0 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
2cbe0 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
2cbf0 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
2cc00 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
2cc10 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
2cc20 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
2cc30 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
2cc40 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
2cc50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
2cc60 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2cc70 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2cc80 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2cc90 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ccb0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2ccc0 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
2ccd0 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  (), zRelative);.
2cce0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ccf0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  E_OK;.  }.  zCon
2cd00 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
2cd10 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
2cd20 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
2cd30 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
2cd40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2cd50 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
2cd60 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
2cd70 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
2cd80 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
2cd90 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
2cda0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
2cdb0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
2cdc0 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
2cdd0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
2cde0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2cdf0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2ce00 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
2ce10 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
2ce20 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
2ce30 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
2ce40 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce60 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
2ce70 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame1", zRelative
2ce80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  );.    }.    nBy
2ce90 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
2cea0 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
2ceb0 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
2cec0 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
2ced0 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
2cee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2cef0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2cf00 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
2cf10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2cf20 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2cf30 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  }.    nByte = os
2cf40 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
2cf50 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
2cf60 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
2cf70 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
2cf80 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
2cf90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2cfa0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2cfb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2cfc0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
2cfd0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
2cfe0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2cff0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
2d000 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2d030 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69  hname2", zRelati
2d040 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
2d050 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2d060 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
2d070 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  t = winUnicodeTo
2d080 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Utf8(zTemp);.   
2d090 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
2d0a0 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  emp);.  }.#ifdef
2d0b0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
2d0c0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
2d0d0 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a     char *zTemp;.
2d0e0 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2d0f0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
2d100 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
2d110 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2d120 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
2d130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2d140 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2d150 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2d160 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2d170 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
2d180 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
2d190 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
2d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
2d1b0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22  inFullPathname3"
2d1c0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2d1d0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d    }.    nByte +=
2d1e0 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
2d1f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2d200 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
2d210 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
2d220 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
2d230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2d240 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
2d250 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d260 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2d270 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d280 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
2d290 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
2d2a0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
2d2b0 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
2d2c0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
2d2d0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2d2e0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2d2f0 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
2d300 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2d310 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2d320 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2d330 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
2d340 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
2d350 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
2d370 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22  inFullPathname4"
2d380 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2d390 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2d3a0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2d3b0 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e  ;.    zOut = win
2d3c0 4d 62 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70  MbcsToUtf8(zTemp
2d3d0 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  , osAreFileApisA
2d3e0 4e 53 49 28 29 29 3b 0a 20 20 20 20 73 71 6c 69  NSI());.    sqli
2d3f0 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
2d400 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2d410 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
2d420 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2d430 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2d440 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2d450 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
2d460 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2d470 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
2d480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d4a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2d4b0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
2d4c0 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65  #endif.}..#ifnde
2d4d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2d4e0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
2d4f0 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
2d500 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
2d510 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
2d520 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
2d530 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
2d540 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
2d550 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
2d560 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
2d570 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
2d580 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
2d590 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
2d5a0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2d5b0 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
2d5c0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
2d5d0 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46  GWIN__).  int nF
2d5e0 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ull = pVfs->mxPa
2d5f0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72  thname+1;.  char
2d600 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65   *zFull = sqlite
2d610 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75  3MallocZero( nFu
2d620 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  ll );.  void *zC
2d630 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
2d640 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a  if( zFull==0 ){.
2d650 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c      OSTRACE(("DL
2d660 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
2d670 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
2d680 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29  ename, (void*)0)
2d690 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2d6a0 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 46 75  .  }.  if( winFu
2d6b0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2d6c0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
2d6d0 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54  l, zFull)!=SQLIT
2d6e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2d6f0 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b  te3_free(zFull);
2d700 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
2d710 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
2d720 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
2d730 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
2d740 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
2d750 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74  ;.  }.  zConvert
2d760 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
2d770 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
2d780 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zFull);.  sqlite
2d790 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23  3_free(zFull);.#
2d7a0 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  else.  void *zCo
2d7b0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
2d7c0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
2d7d0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
2d7e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d7f0 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e 64 69  TER(pVfs);.#endi
2d800 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  f.  if( zConvert
2d810 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
2d820 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2d830 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2d840 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2d850 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
2d860 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2d870 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
2d880 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2d890 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  NRT.    h = osLo
2d8a0 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
2d8b0 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  y((LPCWSTR)zConv
2d8c0 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65  erted, 0);.#else
2d8d0 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
2d8e0 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52  ibraryW((LPCWSTR
2d8f0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
2d900 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
2d910 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2d920 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
2d930 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
2d940 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  aryA((char*)zCon
2d950 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
2d960 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
2d970 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
2d980 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
2d990 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
2d9a0 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  h));.  sqlite3_f
2d9b0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
2d9c0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
2d9d0 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
2d9e0 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
2d9f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2da00 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2da10 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
2da20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2da30 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74  s);.  winGetLast
2da40 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
2da50 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
2da60 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
2da70 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c  tic void (*winDl
2da80 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
2da90 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63  *pVfs,void *pH,c
2daa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29  onst char *zSym)
2dab0 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 50 52  )(void){.  FARPR
2dac0 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45  OC proc;.  UNUSE
2dad0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2dae0 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47 65  );.  proc = osGe
2daf0 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
2db00 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b  ANDLE)pH, zSym);
2db10 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 53  .  OSTRACE(("DLS
2db20 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79  YM handle=%p, sy
2db30 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73 73  mbol=%s, address
2db40 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
2db50 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53     (void*)pH, zS
2db60 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63 29  ym, (void*)proc)
2db70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
2db80 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f 63 3b  d(*)(void))proc;
2db90 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
2dba0 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  inDlClose(sqlite
2dbb0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
2dbc0 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
2dbd0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2dbe0 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c  pVfs);.  osFreeL
2dbf0 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70  ibrary((HANDLE)p
2dc00 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41  Handle);.  OSTRA
2dc10 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e  CE(("DLCLOSE han
2dc20 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64  dle=%p\n", (void
2dc30 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23  *)pHandle));.}.#
2dc40 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
2dc50 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2dc60 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
2dc70 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77  : */.  #define w
2dc80 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  inDlOpen  0.  #d
2dc90 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72  efine winDlError
2dca0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
2dcb0 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
2dcc0 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30  ine winDlClose 0
2dcd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 74 61 74  .#endif../* Stat
2dce0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  e information fo
2dcf0 72 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  r the randomness
2dd00 20 67 61 74 68 65 72 65 72 2e 20 2a 2f 0a 74 79   gatherer. */.ty
2dd10 70 65 64 65 66 20 73 74 72 75 63 74 20 45 6e 74  pedef struct Ent
2dd20 72 6f 70 79 47 61 74 68 65 72 65 72 20 45 6e 74  ropyGatherer Ent
2dd30 72 6f 70 79 47 61 74 68 65 72 65 72 3b 0a 73 74  ropyGatherer;.st
2dd40 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68  ruct EntropyGath
2dd50 65 72 65 72 20 7b 0a 20 20 75 6e 73 69 67 6e 65  erer {.  unsigne
2dd60 64 20 63 68 61 72 20 2a 61 3b 20 20 20 2f 2a 20  d char *a;   /* 
2dd70 47 61 74 68 65 72 20 65 6e 74 72 6f 70 79 20 69  Gather entropy i
2dd80 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
2dd90 2a 2f 0a 20 20 69 6e 74 20 6e 61 3b 20 20 20 20  */.  int na;    
2dda0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2ddb0 20 6f 66 20 61 5b 5d 20 69 6e 20 62 79 74 65 73   of a[] in bytes
2ddc0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
2ddd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52            /* XOR
2dde0 20 6e 65 78 74 20 69 6e 70 75 74 20 69 6e 74 6f   next input into
2ddf0 20 61 5b 69 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e   a[i] */.  int n
2de00 58 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Xor;           /
2de10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 58 4f 52 20  * Number of XOR 
2de20 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f 6e 65 20  operations done 
2de30 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 21 64 65 66 69  */.};..#if !defi
2de40 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2de50 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
2de60 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
2de70 45 53 53 29 0a 2f 2a 20 4d 69 78 20 73 7a 20 62  ESS)./* Mix sz b
2de80 79 74 65 73 20 6f 66 20 65 6e 74 72 6f 70 79 20  ytes of entropy 
2de90 69 6e 74 6f 20 70 2e 20 2a 2f 0a 73 74 61 74 69  into p. */.stati
2dea0 63 20 76 6f 69 64 20 78 6f 72 4d 65 6d 6f 72 79  c void xorMemory
2deb0 28 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72  (EntropyGatherer
2dec0 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   *p, unsigned ch
2ded0 61 72 20 2a 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  ar *x, int sz){.
2dee0 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 66 6f    int j, k;.  fo
2def0 72 28 6a 3d 30 2c 20 6b 3d 70 2d 3e 69 3b 20 6a  r(j=0, k=p->i; j
2df00 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70  <sz; j++){.    p
2df10 2d 3e 61 5b 6b 2b 2b 5d 20 5e 3d 20 78 5b 6a 5d  ->a[k++] ^= x[j]
2df20 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e  ;.    if( k>=p->
2df30 6e 61 20 29 20 6b 20 3d 20 30 3b 0a 20 20 7d 0a  na ) k = 0;.  }.
2df40 20 20 70 2d 3e 69 20 3d 20 6b 3b 0a 20 20 70 2d    p->i = k;.  p-
2df50 3e 6e 58 6f 72 20 2b 3d 20 73 7a 3b 0a 7d 0a 23  >nXor += sz;.}.#
2df60 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
2df70 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
2df80 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
2df90 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53  E_OMIT_RANDOMNES
2dfa0 53 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  S) */../*.** Wri
2dfb0 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79  te up to nBuf by
2dfc0 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73  tes of randomnes
2dfd0 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a  s into zBuf..*/.
2dfe0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61  static int winRa
2dff0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
2e000 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2e010 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2e020 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
2e030 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
2e040 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2e050 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20  IT_RANDOMNESS). 
2e060 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e070 52 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65  R(pVfs);.  memse
2e080 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
2e090 3b 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  ;.  return nBuf;
2e0a0 0a 23 65 6c 73 65 0a 20 20 45 6e 74 72 6f 70 79  .#else.  Entropy
2e0b0 47 61 74 68 65 72 65 72 20 65 3b 0a 20 20 55 4e  Gatherer e;.  UN
2e0c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2e0d0 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  Vfs);.  memset(z
2e0e0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
2e0f0 20 65 2e 61 20 3d 20 28 75 6e 73 69 67 6e 65 64   e.a = (unsigned
2e100 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 65   char*)zBuf;.  e
2e110 2e 6e 61 20 3d 20 6e 42 75 66 3b 0a 20 20 65 2e  .na = nBuf;.  e.
2e120 6e 58 6f 72 20 3d 20 30 3b 0a 20 20 65 2e 69 20  nXor = 0;.  e.i 
2e130 3d 20 30 3b 0a 20 20 7b 0a 20 20 20 20 53 59 53  = 0;.  {.    SYS
2e140 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
2e150 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2e160 78 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  x);.    xorMemor
2e170 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2e180 63 68 61 72 2a 29 26 78 2c 20 73 69 7a 65 6f 66  char*)&x, sizeof
2e190 28 53 59 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20  (SYSTEMTIME));. 
2e1a0 20 7d 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44   }.  {.    DWORD
2e1b0 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
2e1c0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
2e1d0 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65      xorMemory(&e
2e1e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2e1f0 2a 29 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 44  *)&pid, sizeof(D
2e200 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 69 66 20  WORD));.  }.#if 
2e210 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2e220 20 20 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e    {.    ULONGLON
2e230 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  G cnt = osGetTic
2e240 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20  kCount64();.    
2e250 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2e260 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 63  nsigned char*)&c
2e270 6e 74 2c 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47  nt, sizeof(ULONG
2e280 4c 4f 4e 47 29 29 3b 0a 20 20 7d 0a 23 65 6c 73  LONG));.  }.#els
2e290 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
2e2a0 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
2e2b0 6f 75 6e 74 28 29 3b 0a 20 20 20 20 78 6f 72 4d  ount();.    xorM
2e2c0 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2e2d0 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20  ned char*)&cnt, 
2e2e0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a  sizeof(DWORD));.
2e2f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
2e300 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f  LITE_OS_WINRT */
2e310 0a 20 20 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  .  {.    LARGE_I
2e320 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73  NTEGER i;.    os
2e330 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
2e340 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
2e350 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2e360 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2e370 69 2c 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f  i, sizeof(LARGE_
2e380 49 4e 54 45 47 45 52 29 29 3b 0a 20 20 7d 0a 23  INTEGER));.  }.#
2e390 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2e3a0 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
2e3b0 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
2e3c0 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44  E_WIN32_USE_UUID
2e3d0 0a 20 20 7b 0a 20 20 20 20 55 55 49 44 20 69 64  .  {.    UUID id
2e3e0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64  ;.    memset(&id
2e3f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  , 0, sizeof(UUID
2e400 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72  ));.    osUuidCr
2e410 65 61 74 65 28 26 69 64 29 3b 0a 20 20 20 20 78  eate(&id);.    x
2e420 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e  orMemory(&e, (un
2e430 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 64  signed char*)&id
2e440 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2e450 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c  .    memset(&id,
2e460 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29   0, sizeof(UUID)
2e470 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65  );.    osUuidCre
2e480 61 74 65 53 65 71 75 65 6e 74 69 61 6c 28 26 69  ateSequential(&i
2e490 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  d);.    xorMemor
2e4a0 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2e4b0 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f  char*)&id, sizeo
2e4c0 66 28 55 55 49 44 29 29 3b 0a 20 20 7d 0a 23 65  f(UUID));.  }.#e
2e4d0 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2e4e0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
2e4f0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2e500 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
2e510 5f 55 55 49 44 20 2a 2f 0a 20 20 72 65 74 75 72  _UUID */.  retur
2e520 6e 20 65 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20  n e.nXor>nBuf ? 
2e530 6e 42 75 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23  nBuf : e.nXor;.#
2e540 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
2e550 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
2e560 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2e570 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
2e580 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   */.}.../*.** Sl
2e590 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
2e5a0 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
2e5b0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
2e5c0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
2e5d0 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
2e5e0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2e5f0 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
2e600 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  ){.  sqlite3_win
2e610 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73  32_sleep((micros
2e620 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ec+999)/1000);. 
2e630 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e640 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2e650 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
2e660 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
2e670 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2e680 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
2e690 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
2e6a0 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
2e6b0 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
2e6c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2e6d0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
2e6e0 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
2e6f0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
2e700 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
2e710 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
2e720 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
2e730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2e740 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
2e750 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
2e760 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
2e770 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
2e780 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
2e790 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
2e7a0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2e7b0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2e7c0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2e7d0 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
2e7e0 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
2e7f0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2e800 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2e810 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
2e820 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
2e830 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
2e840 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
2e850 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
2e860 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
2e870 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
2e880 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
2e890 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
2e8a0 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
2e8b0 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
2e8c0 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
2e8d0 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
2e8e0 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
2e8f0 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
2e900 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
2e910 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2e920 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2e930 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20   date.** cannot 
2e940 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2e950 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2e960 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2e970 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
2e980 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
2e990 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
2e9a0 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
2e9b0 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
2e9c0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
2e9d0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
2e9e0 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
2e9f0 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
2ea00 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
2ea10 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
2ea20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
2ea30 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
2ea40 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2ea50 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
2ea60 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
2ea70 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2ea80 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
2ea90 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
2eaa0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2eab0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2eac0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2ead0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2eae0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
2eaf0 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
2eb00 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
2eb10 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
2eb20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2eb30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
2eb40 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20  32BitValue =.   
2eb50 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
2eb60 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
2eb70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
2eb80 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
2eb90 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2eba0 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
2ebb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
2ebc0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
2ebd0 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
2ebe0 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
2ebf0 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
2ec00 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
2ec10 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
2ec20 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
2ec30 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
2ec40 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
2ec50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ec60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
2ec70 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
2ec80 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
2ec90 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
2eca0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
2ecb0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
2ecc0 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
2ecd0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
2ece0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
2ecf0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
2ed00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ed10 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
2ed20 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
2ed30 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
2ed40 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
2ed50 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
2ed60 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2ed70 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
2ed80 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
2ed90 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
2eda0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
2edb0 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
2edc0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
2edd0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2ede0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2edf0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
2ee00 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2ee10 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2ee20 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2ee30 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2ee40 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2ee50 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2ee60 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2ee70 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2ee80 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2ee90 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2eea0 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2eeb0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2eec0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2eed0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2eee0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
2eef0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
2ef00 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2ef10 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
2ef20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2ef30 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
2ef40 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2ef50 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2ef60 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
2ef70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ef80 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2ef90 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2efa0 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
2efb0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
2efc0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
2efd0 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
2efe0 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
2eff0 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
2f000 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
2f010 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
2f020 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2f030 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
2f040 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
2f050 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
2f060 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
2f070 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
2f080 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
2f090 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
2f0a0 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
2f0b0 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
2f0c0 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
2f0d0 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
2f0e0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
2f0f0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
2f100 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
2f110 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
2f120 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
2f130 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
2f140 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
2f150 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
2f160 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
2f170 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
2f180 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
2f190 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
2f1a0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
2f1b0 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
2f1c0 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
2f1d0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
2f1e0 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
2f1f0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
2f200 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
2f210 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
2f220 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
2f230 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
2f240 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
2f250 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2f260 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
2f270 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
2f280 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
2f290 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
2f2a0 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
2f2b0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
2f2c0 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
2f2d0 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
2f2e0 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
2f2f0 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
2f300 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
2f310 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
2f320 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
2f330 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
2f340 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
2f350 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2f360 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2f370 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2f380 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
2f390 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
2f3a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
2f3b0 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
2f3c0 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
2f3d0 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
2f3e0 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
2f3f0 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
2f400 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
2f410 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2f420 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2f430 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
2f440 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2f450 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
2f460 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
2f470 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
2f480 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
2f490 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2f4a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2f4b0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2f4c0 75 66 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  uf){.  DWORD e =
2f4d0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2f4e0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2f4f0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
2f500 66 28 20 6e 42 75 66 3e 30 20 29 20 77 69 6e 47  f( nBuf>0 ) winG
2f510 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 65  etLastErrorMsg(e
2f520 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 20  , nBuf, zBuf);. 
2f530 20 72 65 74 75 72 6e 20 65 3b 0a 7d 0a 0a 2f 2a   return e;.}../*
2f540 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2f550 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
2f560 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2f570 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
2f580 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
2f590 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
2f5a0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
2f5b0 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
2f5c0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2f5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2f5e0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2f5f0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2f600 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2f610 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2f620 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
2f630 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2f640 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f660 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2f670 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
2f680 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
2f690 2f 0a 20 20 20 20 26 77 69 6e 41 70 70 44 61 74  /.    &winAppDat
2f6a0 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
2f6b0 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
2f6c0 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
2f6d0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
2f6e0 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
2f6f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2f700 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
2f710 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
2f720 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2f730 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2f740 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20  Pathname,       
2f750 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2f760 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2f770 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2f780 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2f790 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2f7a0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2f7b0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2f7c0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2f7d0 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
2f7e0 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
2f7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f800 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
2f810 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
2f820 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2f830 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
2f840 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
2f850 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
2f860 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2f870 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72  ,        /* xCur
2f880 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2f890 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2f8a0 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
2f8b0 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2f8c0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2f8d0 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e  64,   /* xCurren
2f8e0 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2f8f0 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2f900 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74  ll,      /* xSet
2f910 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2f920 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2f930 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74  ll,      /* xGet
2f940 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2f950 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
2f960 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78  all,     /* xNex
2f970 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2f980 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   };.#if defined(
2f990 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2f9a0 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63 20  _WIDE).  static 
2f9b0 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c  sqlite3_vfs winL
2f9c0 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20  ongPathVfs = {. 
2f9d0 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
2f9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2f9f0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
2fa00 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
2fa10 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
2fa20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
2fa30 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
2fa40 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
2fa50 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa70 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
2fa80 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22  "win32-longpath"
2fa90 2c 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  ,      /* zName 
2faa0 2a 2f 0a 20 20 20 20 26 77 69 6e 41 70 70 44 61  */.    &winAppDa
2fab0 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta,           /*
2fac0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2fad0 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2fae0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2faf0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2fb00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
2fb10 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2fb20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2fb30 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2fb40 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
2fb50 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20  lPathname,      
2fb60 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
2fb70 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
2fb80 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2fb90 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2fba0 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2fbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2fbc0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
2fbd0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2fbe0 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2fbf0 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2fc00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2fc10 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2fc20 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2fc30 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2fc40 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2fc50 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2fc60 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2fc70 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2fc80 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75  e,        /* xCu
2fc90 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
2fca0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2fcb0 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  ,       /* xGetL
2fcc0 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
2fcd0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2fce0 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65  t64,   /* xCurre
2fcf0 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2fd00 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2fd10 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65  all,      /* xSe
2fd20 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2fd30 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
2fd40 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65  all,      /* xGe
2fd50 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2fd60 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2fd70 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65  Call,     /* xNe
2fd80 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2fd90 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74    };.#endif.  st
2fda0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2fdb0 20 77 69 6e 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20   winNolockVfs = 
2fdc0 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fde0 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2fdf0 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2fe00 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
2fe10 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45  le */.    SQLITE
2fe20 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
2fe30 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68  BYTES, /* mxPath
2fe40 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe60 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
2fe70 20 20 20 22 77 69 6e 33 32 2d 6e 6f 6e 65 22 2c     "win32-none",
2fe80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
2fe90 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f  me */.    &winNo
2fea0 6c 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20 20  lockAppData,    
2feb0 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
2fec0 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
2fed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2fee0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2fef0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2ff00 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2ff10 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2ff20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2ff30 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2ff40 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2ff50 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2ff60 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2ff70 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2ff80 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
2ff90 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ffb0 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
2ffc0 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
2ffd0 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
2ffe0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
2fff0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
30000 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
30010 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
30020 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64          /* xRand
30030 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
30040 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
30050 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
30060 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
30070 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Time,        /* 
30080 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
30090 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
300a0 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47  ror,       /* xG
300b0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
300c0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
300d0 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75  eInt64,   /* xCu
300e0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
300f0 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
30100 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  emCall,      /* 
30110 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
30120 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
30130 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  emCall,      /* 
30140 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
30150 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
30160 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20  temCall,     /* 
30170 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
30180 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69  */.  };.#if defi
30190 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
301a0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61  _HAS_WIDE).  sta
301b0 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
301c0 77 69 6e 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63  winLongPathNoloc
301d0 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  kVfs = {.    3, 
301e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301f0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
30200 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
30210 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a  nFile),       /*
30220 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
30230 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
30240 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
30250 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
30260 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
30270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
30280 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
30290 2d 6c 6f 6e 67 70 61 74 68 2d 6e 6f 6e 65 22 2c  -longpath-none",
302a0 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
302b0 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61   &winNolockAppDa
302c0 74 61 2c 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ta,     /* pAppD
302d0 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
302e0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
302f0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
30300 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
30310 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
30320 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
30330 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
30340 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
30350 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
30360 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46  ame,       /* xF
30370 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
30380 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
30390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
303a0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
303b0 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
303c0 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
303d0 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
303e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
303f0 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
30400 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
30410 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
30420 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
30430 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  mness,         /
30440 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
30450 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
30460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
30470 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
30480 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
30490 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
304a0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
304b0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
304c0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
304d0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
304e0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20  rentTimeInt64,  
304f0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
30500 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
30510 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
30520 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
30530 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
30540 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
30550 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
30560 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
30570 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
30580 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
30590 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
305a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62  endif..  /* Doub
305b0 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
305c0 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
305d0 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
305e0 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
305f0 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
30600 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
30610 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
30620 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
30630 53 79 73 63 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a  Syscall)==80 );.
30640 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
30650 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
30660 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
30670 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
30680 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
30690 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
306a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
306b0 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
306c0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
306d0 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
306e0 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
306f0 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
30700 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
30710 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
30720 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
30730 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
30740 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
30750 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
30760 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
30770 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
30780 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
30790 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
307a0 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76  IDE).  sqlite3_v
307b0 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
307c0 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b  LongPathVfs, 0);
307d0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
307e0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
307f0 26 77 69 6e 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30  &winNolockVfs, 0
30800 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
30810 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
30820 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33  _WIDE).  sqlite3
30830 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
30840 69 6e 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b  inLongPathNolock
30850 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  Vfs, 0);.#endif.
30860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30870 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 42 69  OMIT_WAL.  winBi
30880 67 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 4d  gLock = sqlite3M
30890 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
308a0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46  _MUTEX_STATIC_VF
308b0 53 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72  S1);.#endif..  r
308c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
308d0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
308e0 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69  os_end(void){.#i
308f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
30900 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a  T.  if( sleepObj
30910 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73  !=NULL ){.    os
30920 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65  CloseHandle(slee
30930 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70  pObj);.    sleep
30940 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Obj = NULL;.  }.
30950 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
30960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
30970 20 20 77 69 6e 42 69 67 4c 6f 63 6b 20 3d 20 30    winBigLock = 0
30980 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
30990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
309a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
309b0 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a              E_OS_WIN */.