/ Hex Artifact Content
Login

Artifact ac29c25cde4cfb4adacc59cdec4aa45698ca0e29164ea127859585ccd9faa354:


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 55 73 61 62 6c 65 20 73 69      /* Usable si
2330: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2340: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2350: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
2360: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c  ctual; /* Actual
2370: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2380: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2390: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
23a0: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e  zeMax;    /* Con
23b0: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
23c0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23d0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
23e0: 2a 20 54 68 65 20 77 69 6e 56 66 73 41 70 70 44  * The winVfsAppD
23f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
2400: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 41   used for the pA
2410: 70 70 44 61 74 61 20 6d 65 6d 62 65 72 20 66 6f  ppData member fo
2420: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
2430: 57 69 6e 33 32 20 56 46 53 20 76 61 72 69 61 6e  Win32 VFS varian
2440: 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ts..*/.typedef s
2450: 74 72 75 63 74 20 77 69 6e 56 66 73 41 70 70 44  truct winVfsAppD
2460: 61 74 61 20 77 69 6e 56 66 73 41 70 70 44 61 74  ata winVfsAppDat
2470: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 56 66 73  a;.struct winVfs
2480: 41 70 70 44 61 74 61 20 7b 0a 20 20 63 6f 6e 73  AppData {.  cons
2490: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
24a0: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f  hods *pMethod; /
24b0: 2a 20 54 68 65 20 66 69 6c 65 20 49 2f 4f 20 6d  * The file I/O m
24c0: 65 74 68 6f 64 73 20 74 6f 20 75 73 65 2e 20 2a  ethods to use. *
24d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 70 70 44 61  /.  void *pAppDa
24e0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
24f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
2500: 74 72 61 20 70 41 70 70 44 61 74 61 2c 20 69 66  tra pAppData, if
2510: 20 61 6e 79 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20   any. */.  BOOL 
2520: 62 4e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNoLock;        
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2540: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6c 6f 63   Non-zero if loc
2550: 6b 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  king is disabled
2560: 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  . */.};../*.** A
2570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
2580: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c  r winFile.ctrlFl
2590: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ags.*/.#define W
25a0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  INFILE_RDONLY   
25b0: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a         0x02   /*
25c0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
25d0: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
25e0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
25f0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
2600: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2610: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
2620: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
2630: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
2640: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
2650: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
2660: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
2670: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
2680: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
2690: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
26a0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
26b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26c0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
26d0: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
26e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
26f0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
2700: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
2710: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
2720: 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
2730: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33  with SQLITE_WIN3
2740: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64  2_MALLOC on Wind
2750: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65  ows, we will use
2760: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20   the. * various 
2770: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66  Win32 API heap f
2780: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
2790: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f   of our own.. */
27a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
27b0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a  IN32_MALLOC../*.
27c0: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
27d0: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61  n-zero, an isola
27e0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
27f0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
2800: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20  native Win32. * 
2810: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73  allocator subsys
2820: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tem; otherwise, 
2830: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63  the default proc
2840: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ess heap will be
2850: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20   used.  This. * 
2860: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65  setting has no e
2870: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69  ffect when compi
2880: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20  ling for WinRT. 
2890: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
28a0: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20  s is enabled. * 
28b0: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20  and an isolated 
28c0: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65  heap will be cre
28d0: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  ated to store al
28e0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61  l allocated data
28f0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *. **********
2900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2940: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a  ****. * WARNING:
2950: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
2960: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68   to note that wh
2970: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20  en this setting 
2980: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
2990: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20  the. *          
29a0: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66  winMemShutdown f
29b0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29c0: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73  d (e.g. by the s
29d0: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
29e0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63   *          func
29f0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20  tion), all data 
2a00: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74  that was allocat
2a10: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f  ed using the iso
2a20: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a  lated heap will.
2a30: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66   *          be f
2a40: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  reed immediately
2a50: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74   and any attempt
2a60: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f   to access any o
2a70: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20  f that freed. * 
2a80: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69           data wi
2a90: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ll almost certai
2aa0: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  nly result in an
2ab0: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73   immediate acces
2ac0: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a  s violation.. **
2ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f  ************. */
2b20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b30: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
2b40: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2b50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
2b60: 45 41 54 45 20 20 20 20 20 20 20 20 28 54 52 55  EATE        (TRU
2b70: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  E).#endif../*. *
2b80: 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 78   This is the max
2b90: 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 69 6e  imum possible in
2ba0: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
2bb0: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2bc0: 20 68 65 61 70 2c 20 69 6e 0a 20 2a 20 62 79 74   heap, in. * byt
2bd0: 65 73 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  es.. */.#ifndef 
2be0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2bf0: 50 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 0a  P_MAX_INIT_SIZE.
2c00: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2c10: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2c20: 49 4e 49 54 5f 53 49 5a 45 20 28 34 32 39 34 39  INIT_SIZE (42949
2c30: 36 37 32 39 35 55 29 0a 23 65 6e 64 69 66 0a 0a  67295U).#endif..
2c40: 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74 68  /*. * This is th
2c50: 65 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f  e extra space fo
2c60: 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 69  r the initial si
2c70: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
2c80: 73 70 65 63 69 66 69 63 20 68 65 61 70 2c 0a 20  specific heap,. 
2c90: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
2ca0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
2cb0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
2cc0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2cd0: 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 0a 23 20  AP_INIT_EXTRA.# 
2ce0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2cf0: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45  IN32_HEAP_INIT_E
2d00: 58 54 52 41 20 20 28 34 31 39 34 33 30 34 29 0a  XTRA  (4194304).
2d10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 43 61  #endif../*. * Ca
2d20: 6c 63 75 6c 61 74 65 20 74 68 65 20 6d 61 78 69  lculate the maxi
2d30: 6d 75 6d 20 6c 65 67 61 6c 20 63 61 63 68 65 20  mum legal cache 
2d40: 73 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  size, in pages, 
2d50: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 78  based on the max
2d60: 69 6d 75 6d 0a 20 2a 20 70 6f 73 73 69 62 6c 65  imum. * possible
2d70: 20 69 6e 69 74 69 61 6c 20 68 65 61 70 20 73 69   initial heap si
2d80: 7a 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75  ze and the defau
2d90: 6c 74 20 70 61 67 65 20 73 69 7a 65 2c 20 73 65  lt page size, se
2da0: 74 74 69 6e 67 20 61 73 69 64 65 20 74 68 65 0a  tting aside the.
2db0: 20 2a 20 6e 65 65 64 65 64 20 65 78 74 72 61 20   * needed extra 
2dc0: 73 70 61 63 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64  space.. */.#ifnd
2dd0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2de0: 4d 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23  MAX_CACHE_SIZE.#
2df0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2e00: 57 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f  WIN32_MAX_CACHE_
2e10: 53 49 5a 45 20 20 20 28 28 28 53 51 4c 49 54 45  SIZE   (((SQLITE
2e20: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2e30: 49 4e 49 54 5f 53 49 5a 45 29 20 2d 20 5c 0a 20  INIT_SIZE) - \. 
2e40: 20 20 20 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 28 53 51 4c 49 54 45           (SQLITE
2e70: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
2e80: 5f 45 58 54 52 41 29 29 20 2f 20 5c 0a 20 20 20  _EXTRA)) / \.   
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45        (SQLITE_DE
2ec0: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2ed0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2ee0: 54 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69  This is cache si
2ef0: 7a 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63  ze used in the c
2f00: 61 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68  alculation of th
2f10: 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f  e initial size o
2f20: 66 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73  f the. * Win32-s
2f30: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49  pecific heap.  I
2f40: 74 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61  t cannot be nega
2f50: 74 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  tive.. */.#ifnde
2f60: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  f SQLITE_WIN32_C
2f70: 41 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20  ACHE_SIZE.#  if 
2f80: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
2f90: 41 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20  ACHE_SIZE>=0.#  
2fa0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2fb0: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
2fc0: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46       (SQLITE_DEF
2fd0: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
2fe0: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65  .#  else.#    de
2ff0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
3000: 32 5f 43 41 43 48 45 5f 53 49 5a 45 20 20 20 20  2_CACHE_SIZE    
3010: 20 28 2d 28 53 51 4c 49 54 45 5f 44 45 46 41 55   (-(SQLITE_DEFAU
3020: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 29 0a  LT_CACHE_SIZE)).
3030: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
3040: 0a 2f 2a 0a 20 2a 20 4d 61 6b 65 20 73 75 72 65  ./*. * Make sure
3050: 20 74 68 61 74 20 74 68 65 20 63 61 6c 63 75 6c   that the calcul
3060: 61 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 2c  ated cache size,
3070: 20 69 6e 20 70 61 67 65 73 2c 20 63 61 6e 6e 6f   in pages, canno
3080: 74 20 63 61 75 73 65 20 74 68 65 0a 20 2a 20 69  t cause the. * i
3090: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
30a0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
30b0: 63 20 68 65 61 70 20 74 6f 20 65 78 63 65 65 64  c heap to exceed
30c0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
30d0: 75 6e 74 0a 20 2a 20 6f 66 20 6d 65 6d 6f 72 79  unt. * of memory
30e0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 70 65   that can be spe
30f0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  cified in the ca
3100: 6c 6c 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ll to HeapCreate
3110: 2e 0a 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  .. */.#if SQLITE
3120: 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a  _WIN32_CACHE_SIZ
3130: 45 3e 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  E>SQLITE_WIN32_M
3140: 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  AX_CACHE_SIZE.# 
3150: 20 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49   undef SQLITE_WI
3160: 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23  N32_CACHE_SIZE.#
3170: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
3180: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
3190: 20 20 20 20 20 20 20 28 32 30 30 30 29 0a 23 65         (2000).#e
31a0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
31b0: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20  initial size of 
31c0: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
31d0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
31e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
31f0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
3200: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
3210: 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66  INIT_SIZE.#  def
3220: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
3230: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20  _HEAP_INIT_SIZE 
3240: 20 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32    ((SQLITE_WIN32
3250: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
3260: 0a 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 20 20 28 53 51 4c 49 54            (SQLIT
3290: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
32a0: 49 5a 45 29 20 2b 20 5c 0a 20 20 20 20 20 20 20  IZE) + \.       
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f    (SQLITE_WIN32_
32e0: 48 45 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 29  HEAP_INIT_EXTRA)
32f0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
3300: 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  The maximum size
3310: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70   of the Win32-sp
3320: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68  ecific heap.  Th
3330: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  is value may be 
3340: 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  zero.. */.#ifnde
3350: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
3360: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20  EAP_MAX_SIZE.#  
3370: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
3380: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
3390: 45 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a  E    (0).#endif.
33a0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61  ./*. * The extra
33b0: 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e   flags to use in
33c0: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69   calls to the Wi
33d0: 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20  n32 heap APIs.  
33e0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
33f0: 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68  e. * zero for th
3400: 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
3410: 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  or.. */.#ifndef 
3420: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
3430: 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e  P_FLAGS.#  defin
3440: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
3450: 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 20 20  EAP_FLAGS       
3460: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  (0).#endif.../*.
3470: 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74  ** The winMemDat
3480: 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72  a structure stor
3490: 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  es information r
34a0: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57  equired by the W
34b0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a  in32-specific.**
34c0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
34d0: 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  hods implementat
34e0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
34f0: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
3500: 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74  a winMemData;.st
3510: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
3520: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
3530: 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20  .  u32 magic1;  
3540: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
3550: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
3560: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
3570: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e   */.#endif.  HAN
3580: 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68  DLE hHeap; /* Th
3590: 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20  e handle to our 
35a0: 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20  heap. */.  BOOL 
35b0: 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77  bOwned;  /* Do w
35c0: 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28  e own the heap (
35d0: 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20  i.e. destroy it 
35e0: 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f  on shutdown)? */
35f0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3600: 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20    u32 magic2;   
3610: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
3620: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
3630: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
3640: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69  */.#endif.};..#i
3650: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
3660: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
3670: 43 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30  C1     0x42b2830
3680: 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  b.#define WINMEM
3690: 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64  _MAGIC2     0xbd
36a0: 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73  4d7cf4.#endif..s
36b0: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
36c0: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
36d0: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
36e0: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
36f0: 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a  _MAGIC1,.#endif.
3700: 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69    NULL, FALSE.#i
3710: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c  fndef NDEBUG.  ,
3720: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65  WINMEM_MAGIC2.#e
3730: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
3740: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
3750: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
3760: 63 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c1() assert( win
3770: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31  _mem_data.magic1
3780: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
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 32 28 29 20 61  AssertMagic2() a
37b0: 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64  ssert( win_mem_d
37c0: 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ata.magic2==WINM
37d0: 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66  EM_MAGIC2 ).#def
37e0: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
37f0: 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41  Magic()  winMemA
3800: 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77  ssertMagic1(); w
3810: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3820: 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69  2();.#else.#defi
3830: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
3840: 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23  agic().#endif..#
3850: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
3860: 44 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f  DataPtr()  &win_
3870: 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65  mem_data.#define
3880: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
3890: 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74       win_mem_dat
38a0: 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20  a.hHeap.#define 
38b0: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
38c0: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
38d0: 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20  .bOwned..static 
38e0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
38f0: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  oc(int nBytes);.
3900: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
3910: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
3920: 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ior);.static voi
3930: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
3940: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
3950: 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74  nt nBytes);.stat
3960: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
3970: 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74  e(void *p);.stat
3980: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
3990: 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61  ndup(int n);.sta
39a0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
39b0: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
39c0: 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  a);.static void 
39d0: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
39e0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a  oid *pAppData);.
39f0: 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d  .const sqlite3_m
3a00: 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69  em_methods *sqli
3a10: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76  te3MemGetWin32(v
3a20: 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  oid);.#endif /* 
3a30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
3a40: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  LOC */../*.** Th
3a50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
3a60: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
3a70: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
3a80: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
3a90: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
3aa0: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
3ab0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
3ac0: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a  ystem is Win9x.*
3ad0: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
3ae0: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
3af0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
3b00: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
3b10: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
3b20: 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  9x..** 2:   Oper
3b30: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
3b40: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
3b50: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
3b60: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
3b70: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
3b80: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
3b90: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
3ba0: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
3bb0: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
3bc0: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
3bd0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3be0: 54 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45  TEST.LONG SQLITE
3bf0: 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20  _WIN32_VOLATILE 
3c00: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
3c10: 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  = 0;.#else.stati
3c20: 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49  c LONG SQLITE_WI
3c30: 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c  N32_VOLATILE sql
3c40: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
3c50: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
3c60: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
3c70: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
3c80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
3c90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3ca0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
3cb0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ot available on 
3cc0: 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69  Windows CE or Wi
3cd0: 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51  nRT.. */..#if SQ
3ce0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3cf0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
3d00: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65  .#  define osAre
3d10: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20  FileApisANSI()  
3d20: 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f       1.#endif../
3d30: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
3d40: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
3d50: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
3d60: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
3d70: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
3d80: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
3d90: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
3da0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
3db0: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
3dc0: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
3dd0: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
3de0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
3df0: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
3e00: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
3e10: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
3e20: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3e30: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
3e40: 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c  truct win_syscal
3e50: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
3e60: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
3e70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3e80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
3e90: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
3ea0: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
3eb0: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
3ec0: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
3ed0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
3ee0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
3ef0: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
3f00: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
3f10: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69  Syscall[] = {.#i
3f20: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3f30: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
3f40: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46  _WINRT.  { "AreF
3f50: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
3f60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41        (SYSCALL)A
3f70: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20  reFileApisANSI, 
3f80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3f90: 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  se.  { "AreFileA
3fa0: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
3fb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3fe0: 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69  .#ifndef osAreFi
3ff0: 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69  leApisANSI.#defi
4000: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
4010: 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ANSI ((BOOL(WINA
4020: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4030: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
4040: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
4050: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
4060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4070: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4080: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
40a0: 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72  YSCALL)CharLower
40b0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
40c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
40d0: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20  CharLowerW",    
40e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
40f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4100: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4110: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4120: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28   osCharLowerW ((
4130: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
4140: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
4150: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [1].pCurrent)..#
4160: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4170: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
4180: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4190: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70  IDE).  { "CharUp
41a0: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
41b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
41c0: 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20  rUpperW,        
41d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41e0: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57  .  { "CharUpperW
41f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4200: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4230: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70  define osCharUpp
4240: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
4250: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
4260: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
4270: 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48  nt)..  { "CloseH
4280: 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20  andle",         
4290: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f      (SYSCALL)Clo
42a0: 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  seHandle,       
42b0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
42c0: 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  ine osCloseHandl
42d0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
42e0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
42f0: 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[3].pCurrent).
4300: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4310: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4320: 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  SI).  { "CreateF
4330: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
4340: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
4350: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
4360: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4370: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41    { "CreateFileA
4380: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4390: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
43c0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
43d0: 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leA ((HANDLE(WIN
43e0: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f  API*)(LPCSTR,DWO
43f0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
4400: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
4410: 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c  TTRIBUTES,DWORD,
4420: 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53  DWORD,HANDLE))aS
4430: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
4440: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4450: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4460: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4470: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4480: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
4490: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
44a0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c  ALL)CreateFileW,
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
44c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
44d0: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  ateFileW",      
44e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
44f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4500: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4510: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4520: 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41  CreateFileW ((HA
4530: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
4540: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
4550: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
4560: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
4570: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
4580: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4590: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
45a0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
45b0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
45c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
45d0: 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20  NSI) && \.      
45e0: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
45f0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4600: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4610: 53 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20  SIZE>0) && \.   
4620: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
4630: 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50  2_CREATEFILEMAPP
4640: 49 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65  INGA.  { "Create
4650: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
4660: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
4670: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c  ateFileMappingA,
4680: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4690: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
46a0: 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20  MappingA",      
46b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
46e0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
46f0: 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41  ileMappingA ((HA
4700: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
4710: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
4720: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
4730: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
4740: 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29  D,DWORD,LPCSTR))
4750: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
4760: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
4770: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21  E_OS_WINCE || (!
4780: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4790: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
47a0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
47b0: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  ) && \.        (
47c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
47d0: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
47e0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
47f0: 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74  E>0)).  { "Creat
4800: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
4810: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
4820: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
4830: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
4840: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
4850: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
4860: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4890: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
48a0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48  FileMappingW ((H
48b0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
48c0: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
48d0: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
48e0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
48f0: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  RD,DWORD,LPCWSTR
4900: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
4910: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4920: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4930: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4940: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4950: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
4960: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4970: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75  SYSCALL)CreateMu
4980: 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20  texW,           
4990: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
49a0: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
49b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
49c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
49e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
49f0: 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  e osCreateMutexW
4a00: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
4a10: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
4a20: 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c  TRIBUTES,BOOL, \
4a30: 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52  .        LPCWSTR
4a40: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
4a50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4a60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4a70: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4a80: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
4a90: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4aa0: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c  ALL)DeleteFileA,
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4ac0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
4ad0: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
4ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4af0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4b10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4b20: 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f  DeleteFileA ((BO
4b30: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
4b40: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  TR))aSyscall[9].
4b50: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4b60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4b70: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4b80: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4ba0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
4bb0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
4bc0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
4bd0: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
4be0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4bf0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c10: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4c20: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28  osDeleteFileW ((
4c30: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4c40: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4c50: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  10].pCurrent)..#
4c60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4c70: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
4c80: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
4c90: 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54  , (SYSCALL)FileT
4ca0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
4cb0: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
4cc0: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f   { "FileTimeToLo
4cd0: 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  calFileTime", (S
4ce0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4d10: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
4d20: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28  oLocalFileTime (
4d30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
4d40: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
4d50: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
4d60: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
4d70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4d80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4d90: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4da0: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
4db0: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4dc0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20  meToSystemTime, 
4dd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4de0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  { "FileTimeToSys
4df0: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59  temTime",    (SY
4e00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4e20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4e30: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
4e40: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f  SystemTime ((BOO
4e50: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
4e60: 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20   FILETIME*, \.  
4e70: 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49        LPSYSTEMTI
4e80: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d  ME))aSyscall[12]
4e90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4ea0: 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  "FlushFileBuffer
4eb0: 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  s",        (SYSC
4ec0: 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66  ALL)FlushFileBuf
4ed0: 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d  fers,        0 }
4ee0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  ,..#define osFlu
4ef0: 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28  shFileBuffers ((
4f00: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4f10: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  NDLE))aSyscall[1
4f20: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
4f30: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4f40: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4f50: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
4f60: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
4f70: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
4f80: 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20  essageA,        
4f90: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4fa0: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41   "FormatMessageA
4fb0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4fc0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4fe0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4ff0: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
5000: 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geA ((DWORD(WINA
5010: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
5020: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
5030: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
5040: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
5050: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
5060: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5070: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5080: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
5090: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
50a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
50b0: 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  LL)FormatMessage
50c0: 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  W,          0 },
50d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d  .#else.  { "Form
50e0: 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20  atMessageW",    
50f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5110: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5120: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
5130: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28  ormatMessageW ((
5140: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
5150: 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  WORD,LPCVOID,DWO
5160: 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c  RD,DWORD,LPWSTR,
5170: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
5180: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
5190: 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74  all[15].pCurrent
51a0: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
51b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
51c0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
51d0: 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20  "FreeLibrary",  
51e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
51f0: 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c  ALL)FreeLibrary,
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5210: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65  ,.#else.  { "Fre
5220: 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20  eLibrary",      
5230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5240: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5260: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5270: 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f  FreeLibrary ((BO
5280: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44  OL(WINAPI*)(HMOD
5290: 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  ULE))aSyscall[16
52a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
52b0: 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63   "GetCurrentProc
52c0: 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53  essId",     (SYS
52d0: 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50  CALL)GetCurrentP
52e0: 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20  rocessId,     0 
52f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
5300: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
5310: 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  d ((DWORD(WINAPI
5320: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5330: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
5340: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5350: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
5360: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5370: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
5380: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c  DiskFreeSpaceA",
5390: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
53a0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
53b0: 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  A,       0 },.#e
53c0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
53d0: 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20  FreeSpaceA",    
53e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5410: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
5420: 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28  iskFreeSpaceA ((
5430: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
5440: 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  CSTR,LPDWORD,LPD
5450: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
5460: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
5470: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
5480: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5490: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
54a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
54b0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
54c0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
54d0: 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  DE).  { "GetDisk
54e0: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
54f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44     (SYSCALL)GetD
5500: 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20  iskFreeSpaceW,  
5510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5520: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
5530: 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28  SpaceW",       (
5540: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5570: 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46  efine osGetDiskF
5580: 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c  reeSpaceW ((BOOL
5590: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
55a0: 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  R,LPDWORD,LPDWOR
55b0: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
55c0: 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53       LPDWORD))aS
55d0: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
55e0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
55f0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5600: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
5610: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
5620: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
5630: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
5640: 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esA,      0 },.#
5650: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
5660: 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20  eAttributesA",  
5670: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
56a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
56b0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20  FileAttributesA 
56c0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
56d0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
56e0: 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[20].pCurrent).
56f0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5700: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
5710: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5720: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
5730: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
5740: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
5750: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
5760: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
5770: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
5780: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
5790: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
57c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
57d0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
57e0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
57f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
5800: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
5810: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5820: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5830: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
5840: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
5850: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
5860: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
5870: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
5880: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5890: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
58a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
58d0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
58e0: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
58f0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
5900: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
5910: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
5920: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
5930: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
5940: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5950: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
5960: 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20  "GetFileSize",  
5970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5980: 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c  ALL)GetFileSize,
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
59a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
59b0: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
59c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
59d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
59e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
59f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5a00: 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57  GetFileSize ((DW
5a10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5a20: 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79  DLE,LPDWORD))aSy
5a30: 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65  scall[23].pCurre
5a40: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5a50: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
5a60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5a70: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
5a80: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
5a90: 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  A",        (SYSC
5aa0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
5ab0: 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d  ameA,        0 }
5ac0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5ad0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20  FullPathNameA", 
5ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5af0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5b20: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5b30: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5b40: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c  )(LPCSTR,DWORD,L
5b50: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
5b60: 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c  LPSTR*))aSyscall
5b70: 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [24].pCurrent)..
5b80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5b90: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5ba0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
5bb0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5bc0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
5bd0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
5be0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5bf0: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
5c00: 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meW,        0 },
5c10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5c20: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20  ullPathNameW",  
5c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5c50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5c60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5c70: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20  etFullPathNameW 
5c80: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5c90: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c  (LPCWSTR,DWORD,L
5ca0: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
5cb0: 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61   LPWSTR*))aSysca
5cc0: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
5cd0: 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72  ..  { "GetLastEr
5ce0: 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ror",           
5cf0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73   (SYSCALL)GetLas
5d00: 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  tError,         
5d10: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5d20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20   osGetLastError 
5d30: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5d40: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5d50: 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  26].pCurrent)..#
5d60: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5d70: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
5d80: 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49  ENSION).#if SQLI
5d90: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
5da0: 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72   The GetProcAddr
5db0: 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69  essA() routine i
5dc0: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
5dd0: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20   on Windows CE. 
5de0: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
5df0: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5e00: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
5e10: 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20  ocAddressA,     
5e20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5e30: 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69   /* All other Wi
5e40: 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20  ndows platforms 
5e50: 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64  expect GetProcAd
5e60: 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a  dress() to take.
5e70: 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72    ** an ANSI str
5e80: 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
5e90: 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73  f the _UNICODE s
5ea0: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47  etting */.  { "G
5eb0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
5ec0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ed0: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
5ee0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
5ef0: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b  #endif.#else.  {
5f00: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
5f10: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
5f20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5f40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5f50: 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72  ne osGetProcAddr
5f60: 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57  essA ((FARPROC(W
5f70: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c  INAPI*)(HMODULE,
5f80: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
5f90: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e  R))aSyscall[27].
5fa0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5fb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5fc0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e    { "GetSystemIn
5fd0: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  fo",           (
5fe0: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
5ff0: 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  mInfo,          
6000: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6010: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
6020: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6030: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6050: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6060: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
6070: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
6080: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
6090: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
60a0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
60b0: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
60c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
60d0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
60e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
60f0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
6100: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
6110: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
6120: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
6130: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
6140: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6150: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
6160: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
6170: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
6180: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
6190: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
61a0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
61b0: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
61c0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
61f0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
6200: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
6210: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
6220: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
6230: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
6240: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
6250: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6260: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
6270: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
6280: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
6290: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
62a0: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
62b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
62c0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
62e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6300: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6310: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
6320: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
6330: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
6340: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
6350: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6360: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6380: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
6390: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57   { "GetTempPathW
63a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
63b0: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
63c0: 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  thW,            
63d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
63e0: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
63f0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6400: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6410: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6420: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6430: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20   osGetTempPathW 
6440: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
6450: 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61  (DWORD,LPWSTR))a
6460: 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72  Syscall[32].pCur
6470: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6480: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6490: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20  "GetTickCount", 
64a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
64b0: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
64c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
64d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
64e0: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
64f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6500: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6510: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6520: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6530: 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44  GetTickCount ((D
6540: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
6550: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d  ID))aSyscall[33]
6560: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6570: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6580: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
6590: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
65a0: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
65b0: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
65c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
65d0: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
65e0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  A,           0 }
65f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6600: 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20  VersionExA",    
6610: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6620: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6630: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6640: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6650: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28  GetVersionExA ((
6660: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
6670: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
6680: 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63  SIONINFOA))aSysc
6690: 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74  all[34].pCurrent
66a0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
66b0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
66c0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
66d0: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
66e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
66f0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
6700: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
6710: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExW",           
6720: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
6730: 69 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20  ionExW,         
6740: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6750: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
6760: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
6770: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6790: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
67a0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
67b0: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
67c0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
67d0: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29  OSVERSIONINFOW))
67e0: 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75  aSyscall[35].pCu
67f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
6800: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
6810: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6820: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
6830: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6840: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
6850: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
6860: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6870: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6880: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36  E_T))aSyscall[36
6890: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
68a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
68b0: 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  T.  { "HeapCreat
68c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
68d0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72   (SYSCALL)HeapCr
68e0: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
68f0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6900: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6920: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6940: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6950: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
6960: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
6970: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
6980: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6990: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e  T))aSyscall[37].
69a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
69b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
69c0: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
69d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
69e0: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
69f0: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
6a00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6a10: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6a20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6a30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6a60: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
6a70: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6a80: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
6a90: 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [38].pCurrent)..
6aa0: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6ac0: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
6ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6ae0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6af0: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
6b00: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6b10: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
6b20: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
6b30: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
6b40: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
6b50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6b60: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
6b70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
6b80: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
6b90: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
6ba0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6bb0: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
6bc0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6bd0: 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65  scall[40].pCurre
6be0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
6bf0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
6c00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6c10: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
6c20: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6c30: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
6c40: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
6c50: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
6c60: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
6c70: 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70  ))aSyscall[41].p
6c80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6c90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6ca0: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
6cb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6cc0: 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64  YSCALL)HeapValid
6cd0: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
6ce0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6cf0: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6d00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6d10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6d40: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
6d50: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6d60: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6d70: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
6d80: 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43  )aSyscall[42].pC
6d90: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6da0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
6db0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6dc0: 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61  T.  { "HeapCompa
6dd0: 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ct",            
6de0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f   (SYSCALL)HeapCo
6df0: 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20  mpact,          
6e00: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6e10: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6e30: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6e50: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6e60: 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63  ine osHeapCompac
6e70: 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a  t ((UINT(WINAPI*
6e80: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29  )(HANDLE,DWORD))
6e90: 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75  aSyscall[43].pCu
6ea0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
6eb0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
6ec0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
6ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6ee0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
6ef0: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
6f00: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
6f10: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
6f20: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
6f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6f40: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6f50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6f60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6f90: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
6fa0: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
6fb0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
6fc0: 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72  Syscall[44].pCur
6fd0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6fe0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
6ff0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
7000: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
7010: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
7020: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7030: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
7040: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
7050: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
7060: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
7070: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
7080: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7090: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
70a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
70b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
70d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
70e0: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
70f0: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
7100: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
7110: 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65  scall[45].pCurre
7120: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7130: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
7140: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
7150: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7160: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
7170: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7180: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
7190: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
71a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
71d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
71e0: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
71f0: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
7200: 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70  ))aSyscall[46].p
7210: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
7220: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
7230: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
7240: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
7250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7260: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
7270: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
7280: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7290: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
72b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
72e0: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
72f0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
7300: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7310: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7320: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7330: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7340: 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72  yscall[47].pCurr
7350: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7360: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7370: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
7380: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
7390: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
73a0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
73b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
73c0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
73e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7400: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
7410: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
7420: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
7430: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
7440: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7450: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
7460: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7470: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7480: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
7490: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
74a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
74b0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
74c0: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
74d0: 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c     (!defined(SQL
74e0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
74f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
7500: 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d  _SIZE>0)).  { "M
7510: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
7520: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7530: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  L)MapViewOfFile,
7540: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7550: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
7560: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7570: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
75a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
75b0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
75c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
75d0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
75e0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
75f0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
7600: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
7610: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
7620: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
7630: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
7640: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
7650: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
7660: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
7670: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
7680: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
7690: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
76a0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
76b0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e  t))aSyscall[50].
76c0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
76d0: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
76e0: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
76f0: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
7700: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
7710: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
7720: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
7730: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
7740: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
7750: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
7760: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
7770: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
7780: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7790: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
77a0: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
77b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
77c0: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
77d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
77e0: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
77f0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
7800: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
7810: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
7820: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
7830: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
7840: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7850: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
7860: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
7870: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
7880: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
7890: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
78a0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d  LE))aSyscall[53]
78b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
78c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
78d0: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
78e0: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
78f0: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
7900: 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20  Pointer,        
7910: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7920: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7930: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7940: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7960: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7970: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
7980: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
7990: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
79a0: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
79b0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
79c0: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
79d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
79e0: 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70  WINRT.  { "Sleep
79f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7a00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c       (SYSCALL)Sl
7a10: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
7a20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7a30: 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  e.  { "Sleep",  
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7a80: 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20  #define osSleep 
7a90: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
7aa0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7ab0: 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  55].pCurrent).. 
7ac0: 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f   { "SystemTimeTo
7ad0: 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53  FileTime",    (S
7ae0: 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d  YSCALL)SystemTim
7af0: 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20  eToFileTime,    
7b00: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7b10: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
7b20: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
7b30: 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45  PI*)(CONST SYSTE
7b40: 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  MTIME*, \.      
7b50: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
7b60: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
7b70: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7b80: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
7b90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7ba0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7bc0: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
7bd0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7be0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7bf0: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
7c00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7c10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7c30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
7c40: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64   osUnlockFile.#d
7c50: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
7c60: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7c70: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7c80: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7c90: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7ca0: 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72  yscall[57].pCurr
7cb0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7cc0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7cd0: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
7ce0: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
7cf0: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
7d00: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
7d10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7d20: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
7d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7d40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7d60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7d70: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
7d80: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7d90: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7da0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7db0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
7dc0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38  PED))aSyscall[58
7dd0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7de0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7df0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7e00: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
7e10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
7e20: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d  _SIZE>0.  { "Unm
7e30: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
7e40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7e50: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
7e60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7e70: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
7e80: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7e90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7ec0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
7ed0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
7ee0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
7ef0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  OID))aSyscall[59
7f00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7f10: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
7f20: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
7f30: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
7f40: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
7f50: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
7f60: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
7f70: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
7f80: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
7f90: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
7fa0: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
7fb0: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
7fc0: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
7fd0: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
7fe0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7ff0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
8000: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
8010: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
8020: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
8030: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
8040: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
8050: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
8060: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
8070: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31  PED))aSyscall[61
8080: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8090: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
80a0: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
80b0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
80c0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
80d0: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
80e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
80f0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
8100: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8110: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8130: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8140: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
8150: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
8160: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
8170: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
8180: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
8190: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
81a0: 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e  call[62].pCurren
81b0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
81c0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
81d0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
81e0: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
81f0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
8200: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
8210: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
8220: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
8230: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8260: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
8270: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8280: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
8290: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
82a0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
82b0: 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74  all[63].pCurrent
82c0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
82d0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69  S_WINCE.  { "Wai
82e0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
82f0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
8300: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
8310: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
8320: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
8330: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
8340: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8370: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
8380: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
8390: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
83a0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
83b0: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
83c0: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
83d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
83e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
83f0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
8400: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
8410: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
8420: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
8430: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
8440: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
8450: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8460: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8470: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8480: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8490: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
84a0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
84b0: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
84c0: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
84d0: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
84e0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
84f0: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
8500: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8510: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
8520: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
8530: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
8540: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
8550: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
8560: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8570: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
8580: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
8590: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
85a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
85b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
85c0: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
85d0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
85e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
85f0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
8600: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
8610: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
8620: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
8630: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
8640: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8650: 49 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65  INRT && (!define
8660: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
8670: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
8680: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20  _MMAP_SIZE>0).  
8690: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
86a0: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
86b0: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
86c0: 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30  ileFromApp,    0
86d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d   },.#else.  { "M
86e0: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
86f0: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
8700: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8710: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8720: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8730: 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
8740: 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28  romApp ((LPVOID(
8750: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8760: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c  ULONG,ULONG64, \
8770: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
8780: 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43  )aSyscall[67].pC
8790: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
87a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
87b0: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
87d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32  CALL)CreateFile2
87e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
87f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
8800: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
8810: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8820: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8830: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8840: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8850: 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48  sCreateFile2 ((H
8860: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
8870: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
8880: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
8890: 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45      LPCREATEFILE
88a0: 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
88b0: 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b  ETERS))aSyscall[
88c0: 36 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  68].pCurrent)..#
88d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
88e0: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
88f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
8900: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
8910: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
8920: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
8930: 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  LL)LoadPackagedL
8940: 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c  ibrary,     0 },
8950: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
8960: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
8970: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8990: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
89a0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
89b0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
89c0: 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  ry ((HMODULE(WIN
89d0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c  API*)(LPCWSTR, \
89e0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
89f0: 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75  aSyscall[69].pCu
8a00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8a10: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8a20: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
8a30: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8a40: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
8a50: 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  64,          0 }
8a60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
8a70: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
8a80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8a90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8aa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8ab0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8ac0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28  GetTickCount64 (
8ad0: 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50  (ULONGLONG(WINAP
8ae0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
8af0: 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[70].pCurrent)
8b00: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
8b10: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61  WINRT.  { "GetNa
8b20: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
8b30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
8b40: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
8b50: 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  o,     0 },.#els
8b60: 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  e.  { "GetNative
8b70: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
8b80: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8bb0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74  #define osGetNat
8bc0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  iveSystemInfo ((
8bd0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
8be0: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
8bf0: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
8c00: 5b 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [71].pCurrent)..
8c10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8c20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
8c30: 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  I).  { "OutputDe
8c40: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
8c50: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
8c60: 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20  tDebugStringA,  
8c70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8c80: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8c90: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
8ca0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8cd0: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
8ce0: 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44  ugStringA ((VOID
8cf0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
8d00: 29 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70  ))aSyscall[72].p
8d10: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
8d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8d30: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
8d40: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
8d50: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
8d60: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
8d70: 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20  StringW,      0 
8d80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
8d90: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
8da0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8db0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8dc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8dd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8de0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
8df0: 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngW ((VOID(WINAP
8e00: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
8e10: 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65  scall[73].pCurre
8e20: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f  nt)..  { "GetPro
8e30: 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20  cessHeap",      
8e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8e50: 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20  ProcessHeap,    
8e60: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
8e70: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73  ine osGetProcess
8e80: 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49  Heap ((HANDLE(WI
8e90: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
8ea0: 73 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65  scall[74].pCurre
8eb0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
8ec0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64 65  OS_WINRT && (!de
8ed0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8ee0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
8ef0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
8f00: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
8f10: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22  eMappingFromApp"
8f20: 2c 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74  , (SYSCALL)Creat
8f30: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
8f40: 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  App, 0 },.#else.
8f50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
8f60: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
8f70: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8fa0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
8fb0: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
8fc0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
8fd0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
8fe0: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
8ff0: 41 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47  ATTRIBUTES,ULONG
9000: 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52  ,ULONG64,LPCWSTR
9010: 29 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70  ))aSyscall[75].p
9020: 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20  Current)../*.** 
9030: 4e 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75  NOTE: On some su
9040: 62 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65  b-platforms, the
9050: 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70   InterlockedComp
9060: 61 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e  areExchange "fun
9070: 63 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20  ction".**       
9080: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
9090: 20 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73   macro that uses
90a0: 20 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72   a compiler intr
90b0: 69 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29  insic (e.g. x64)
90c0: 2e 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f  ..**       So do
90d0: 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65   not try to make
90e0: 20 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20   this is into a 
90f0: 72 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65  redefinable inte
9100: 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  rface..*/.#if de
9110: 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65  fined(Interlocke
9120: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9130: 29 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b  ).  { "Interlock
9140: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
9150: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
9180: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
9190: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e  mpareExchange In
91a0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
91b0: 45 78 63 68 61 6e 67 65 0a 23 65 6c 73 65 0a 20  Exchange.#else. 
91c0: 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43   { "InterlockedC
91d0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c  ompareExchange",
91e0: 20 28 53 59 53 43 41 4c 4c 29 49 6e 74 65 72 6c   (SYSCALL)Interl
91f0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
9200: 61 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64 65 66  ange, 0 },..#def
9210: 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  ine osInterlocke
9220: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9230: 20 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29   ((LONG(WINAPI*)
9240: 28 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20 20 20  (LONG \.        
9250: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c  SQLITE_WIN32_VOL
9260: 41 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e  ATILE*, LONG,LON
9270: 47 29 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e  G))aSyscall[76].
9280: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
9290: 20 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65   /* defined(Inte
92a0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
92b0: 63 68 61 6e 67 65 29 20 2a 2f 0a 0a 23 69 66 20  change) */..#if 
92c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
92d0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
92e0: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
92f0: 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20  IN32_USE_UUID.  
9300: 7b 20 22 55 75 69 64 43 72 65 61 74 65 22 2c 20  { "UuidCreate", 
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
9320: 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74  YSCALL)UuidCreat
9330: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
9340: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
9350: 75 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20  uidCreate",     
9360: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
9370: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
9380: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
9390: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
93a0: 6f 73 55 75 69 64 43 72 65 61 74 65 20 28 28 52  osUuidCreate ((R
93b0: 50 43 5f 53 54 41 54 55 53 28 52 50 43 5f 45 4e  PC_STATUS(RPC_EN
93c0: 54 52 59 2a 29 28 55 55 49 44 2a 29 29 61 53 79  TRY*)(UUID*))aSy
93d0: 73 63 61 6c 6c 5b 37 37 5d 2e 70 43 75 72 72 65  scall[77].pCurre
93e0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
93f0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
9400: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
9410: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53   SQLITE_WIN32_US
9420: 45 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64  E_UUID.  { "Uuid
9430: 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c  CreateSequential
9440: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
9450: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
9460: 74 69 61 6c 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  tial,   0 },.#el
9470: 73 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  se.  { "UuidCrea
9480: 74 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20  teSequential",  
9490: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
94c0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43  .#define osUuidC
94d0: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 20  reateSequential 
94e0: 5c 0a 20 20 20 20 20 20 20 20 28 28 52 50 43 5f  \.        ((RPC_
94f0: 53 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59  STATUS(RPC_ENTRY
9500: 2a 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61  *)(UUID*))aSysca
9510: 6c 6c 5b 37 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[78].pCurrent)
9520: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9530: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 26  QLITE_NO_SYNC) &
9540: 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  & SQLITE_MAX_MMA
9550: 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 46 6c  P_SIZE>0.  { "Fl
9560: 75 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  ushViewOfFile", 
9570: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
9580: 4c 29 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c  L)FlushViewOfFil
9590: 65 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  e,        0 },.#
95a0: 65 6c 73 65 0a 20 20 7b 20 22 46 6c 75 73 68 56  else.  { "FlushV
95b0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
95c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
95f0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  f..#define osFlu
9600: 73 68 56 69 65 77 4f 66 46 69 6c 65 20 5c 0a 20  shViewOfFile \. 
9610: 20 20 20 20 20 20 20 28 28 42 4f 4f 4c 28 57 49         ((BOOL(WI
9620: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 2c 53  NAPI*)(LPCVOID,S
9630: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
9640: 37 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  79].pCurrent)..}
9650: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
9660: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
9670: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
9680: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
9690: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
96a0: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
96b0: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
96c0: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
96d0: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
96e0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
96f0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
9700: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
9710: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
9720: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
9730: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
9740: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
9750: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
9760: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
9770: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
9780: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
9790: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
97a0: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
97b0: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
97c0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
97d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
97e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
97f0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
9800: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
9810: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
9820: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
9830: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
9840: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
9850: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
9860: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
9870: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9880: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
9890: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
98a0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
98b0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
98c0: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
98d0: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
98e0: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
98f0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
9900: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
9910: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
9920: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
9930: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9950: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
9960: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
9970: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
9980: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
9990: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
99a0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
99b0: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
99c0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
99d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
99e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
99f0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
9a00: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
9a10: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
9a20: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
9a30: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
9a40: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
9a50: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
9a60: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
9a70: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
9a80: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
9a90: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
9aa0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
9ab0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
9ac0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
9ad0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
9ae0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
9af0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
9b00: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
9b20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9b30: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
9b40: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
9b50: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
9b60: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
9b70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
9b80: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
9b90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9ba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9bb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9bd0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
9be0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
9bf0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
9c00: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
9c10: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
9c20: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
9c30: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
9c40: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
9c50: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
9c60: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
9c70: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
9c80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
9c90: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
9ca0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
9cb0: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
9cc0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
9cd0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
9ce0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
9cf0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
9d00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
9d10: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
9d20: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
9d30: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
9d40: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
9d50: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
9d60: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
9d70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
9d80: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
9d90: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
9da0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
9db0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
9dc0: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
9dd0: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
9de0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
9df0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
9e00: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
9e10: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
9e20: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
9e30: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
9e40: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
9e50: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
9e60: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
9e70: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
9e80: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
9e90: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
9ea0: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
9eb0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
9ec0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
9ed0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
9ee0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
9ef0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
9f00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
9f10: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
9f20: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
9f30: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
9f40: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
9f50: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
9f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
9f70: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
9f80: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
9f90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
9fa0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9fb0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
9fc0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
9fd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9fe0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
9ff0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
a000: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
a010: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
a020: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
a030: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
a040: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
a050: 20 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70   compact it.  Up
a060: 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
a070: 54 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65  TE_OK will be re
a080: 74 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61  turned.  Upon fa
a090: 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66  ilure, one.** of
a0a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53   SQLITE_NOMEM, S
a0b0: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20  QLITE_ERROR, or 
a0c0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
a0d0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
a0e0: 2e 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72  .  The.** "pnLar
a0f0: 67 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20  gest" argument, 
a100: 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c  if non-zero, wil
a110: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74  l be used to ret
a120: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
a130: 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63  the.** largest c
a140: 6f 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c  ommitted free bl
a150: 6f 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c  ock in the heap,
a160: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e   in bytes..*/.in
a170: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
a180: 63 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55  compact_heap(LPU
a190: 49 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a  INT pnLargest){.
a1a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a1b0: 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61  E_OK;.  UINT nLa
a1c0: 72 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e  rgest = 0;.  HAN
a1d0: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
a1e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a1f0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
a200: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
a210: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
a220: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
a230: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
a240: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
a250: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
a260: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
a270: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
a280: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
a290: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
a2a0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
a2b0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a2c0: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
a2d0: 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
a2e0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
a2f0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
a300: 66 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48  f( (nLargest=osH
a310: 65 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70  eapCompact(hHeap
a320: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
a330: 45 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29  EAP_FLAGS))==0 )
a340: 7b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  {.    DWORD last
a350: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
a360: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66  tError();.    if
a370: 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f  ( lastErrno==NO_
a380: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73  ERROR ){.      s
a390: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
a3a0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
a3b0: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20   to HeapCompact 
a3c0: 28 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70  (no space), heap
a3d0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
a3e0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
a3f0: 48 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Heap);.      rc 
a400: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
a410: 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
a420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
a430: 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  g(SQLITE_ERROR, 
a440: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
a450: 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65  ompact (%lu), he
a460: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
a470: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
a480: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
a490: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
a4a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
a4b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OR;.    }.  }.#e
a4c0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  lse.  sqlite3_lo
a4d0: 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  g(SQLITE_NOTFOUN
a4e0: 44 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  D, "failed to He
a4f0: 61 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d  apCompact, heap=
a500: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
a510: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
a520: 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
a530: 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66  NOTFOUND;.#endif
a540: 0a 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74  .  if( pnLargest
a550: 20 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20   ) *pnLargest = 
a560: 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75  nLargest;.  retu
a570: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a580: 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76  If a Win32 nativ
a590: 65 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20  e heap has been 
a5a0: 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73  configured, this
a5b0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
a5c0: 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73  ttempt to.** des
a5d0: 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74  troy and recreat
a5e0: 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69  e it.  If the Wi
a5f0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
a600: 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20  is not isolated 
a610: 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71  and/or.** the sq
a620: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
a630: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  d() function doe
a640: 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72  s not return zer
a650: 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  o, SQLITE_BUSY w
a660: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
a670: 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65  ed and no change
a680: 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  s will be made t
a690: 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  o the Win32 nati
a6a0: 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20  ve heap..*/.int 
a6b0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65  sqlite3_win32_re
a6c0: 73 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e  set_heap(){.  in
a6d0: 74 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  t rc;.  MUTEX_LO
a6e0: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
a6f0: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f  ex *pMaster; ) /
a700: 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69  * The main stati
a710: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54  c mutex */.  MUT
a720: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
a730: 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29  3_mutex *pMem; )
a740: 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79      /* The memsy
a750: 73 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  s static mutex *
a760: 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  /.  MUTEX_LOGIC(
a770: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
a780: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
a790: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
a7a0: 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55  _MASTER); ).  MU
a7b0: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20  TEX_LOGIC( pMem 
a7c0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
a7d0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a7e0: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a  _STATIC_MEM); ).
a7f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a800: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
a810: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a820: 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77  enter(pMem);.  w
a830: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
a840: 28 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d  ();.  if( winMem
a850: 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20  GetHeap()!=NULL 
a860: 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  && winMemGetOwne
a870: 64 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d  d() && sqlite3_m
a880: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
a890: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
a8a0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
a8b0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
a8c0: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d  no outstanding m
a8d0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
a8e0: 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  s on.    ** the 
a8f0: 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e  heap.  Also, sin
a900: 63 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74  ce both the mast
a910: 65 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f  er and memsys lo
a920: 63 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  cks are currentl
a930: 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68  y.    ** being h
a940: 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74  eld by us, no ot
a950: 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e  her function (i.
a960: 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  e. from another 
a970: 74 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20  thread) should. 
a980: 20 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f     ** be able to
a990: 20 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65   even access the
a9a0: 20 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20   heap.  Attempt 
a9b0: 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  to destroy and r
a9c0: 65 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20  ecreate our.    
a9d0: 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33  ** isolated Win3
a9e0: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f  2 native heap no
a9f0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
aa00: 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48  sert( winMemGetH
aa10: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
aa20: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
aa30: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
aa40: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
aa50: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
aa60: 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65  ==0 );.    winMe
aa70: 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d  mShutdown(winMem
aa80: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
aa90: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
aaa0: 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c  mGetHeap()==NULL
aab0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
aac0: 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28  !winMemGetOwned(
aad0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
aae0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
aaf0: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
ab00: 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74   rc = winMemInit
ab10: 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74  (winMemGetDataPt
ab20: 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r());.    assert
ab30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ab40: 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  || winMemGetHeap
ab50: 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()!=NULL );.    
ab60: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ab70: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
ab80: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
ab90: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
aba0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
abb0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
abc0: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
abd0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
abe0: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
abf0: 61 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64  ap cannot be mod
ac00: 69 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74  ified because it
ac10: 20 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a   may be in use..
ac20: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
ac30: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
ac40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ac50: 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20  _leave(pMem);.  
ac60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ac70: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
ac80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
ac90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
aca0: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
acb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
acc0: 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73  on outputs the s
acd0: 70 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20  pecified (ANSI) 
ace0: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69  string to the Wi
acf0: 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  n32 debugger.** 
ad00: 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
ad10: 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */..void sqlite3
ad20: 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62  _win32_write_deb
ad30: 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ug(const char *z
ad40: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
ad50: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
ad60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
ad70: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
ad80: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
ad90: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
ada0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
adb0: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
adc0: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
add0: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
ade0: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
adf0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
ae00: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
ae10: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
ae20: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
ae30: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
ae40: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
ae50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ae60: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
ae70: 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20  f( !zBuf ){.    
ae80: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
ae90: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
aea0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
aeb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
aec0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
aed0: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
aee0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
aef0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
af00: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
af10: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
af20: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
af30: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
af40: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
af50: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
af60: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
af70: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
af80: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
af90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
afa0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
afb0: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
afc0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
afd0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
afe0: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
aff0: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
b000: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
b010: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
b020: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
b030: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
b040: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
b050: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
b060: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
b070: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
b080: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
b090: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
b0a0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
b0b0: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
b0c0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
b0d0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
b0e0: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
b0f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
b100: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
b110: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
b120: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
b130: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
b140: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
b150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
b160: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
b170: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
b180: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
b190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
b1a0: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
b1b0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
b1c0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
b1d0: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
b1e0: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
b1f0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
b200: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
b210: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
b220: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
b230: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
b240: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
b250: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
b260: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
b270: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
b280: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
b290: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
b2a0: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
b2b0: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
b2c0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
b2d0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
b2e0: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
b2f0: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
b320: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
b330: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
b340: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
b350: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
b360: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
b370: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
b380: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
b390: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
b3a0: 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  if.}..#if SQLITE
b3b0: 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
b3c0: 41 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45  ADS>0 && !SQLITE
b3d0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
b3e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b3f0: 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   \.        SQLIT
b400: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 44  E_THREADSAFE>0.D
b410: 57 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e 33  WORD sqlite3Win3
b420: 32 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f 62  2Wait(HANDLE hOb
b430: 6a 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20 72  ject){.  DWORD r
b440: 63 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20  c;.  while( (rc 
b450: 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  = osWaitForSingl
b460: 65 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65 63  eObjectEx(hObjec
b470: 74 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20 20  t, INFINITE,.   
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 20 54 52 55 45 29 29 3d 3d 57 41 49 54      TRUE))==WAIT
b4b0: 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29  _IO_COMPLETION )
b4c0: 7b 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  {}.  return rc;.
b4d0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
b4e0: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
b4f0: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
b500: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
b510: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
b520: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
b530: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
b540: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
b550: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
b560: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
b570: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
b580: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
b590: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
b5a0: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
b5b0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
b5c0: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
b5d0: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
b5e0: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
b5f0: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
b600: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
b610: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
b620: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
b630: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
b640: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
b650: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
b660: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
b670: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
b680: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
b690: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
b6a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b6b0: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
b6c0: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
b6d0: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a  leEx() API..*/..
b6e0: 23 69 66 20 21 53 51 4c 49 54 45 5f 57 49 4e 33  #if !SQLITE_WIN3
b6f0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23  2_GETVERSIONEX.#
b700: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
b710: 20 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49    (1).#elif SQLI
b720: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
b730: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c  QLITE_OS_WINRT |
b740: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
b750: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
b760: 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  ).# define osIsN
b770: 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21  T()  (1).#elif !
b780: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b790: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23  IN32_HAS_WIDE).#
b7a0: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
b7b0: 20 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65    (0).#else.# de
b7c0: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
b7d0: 28 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  (sqlite3_os_type
b7e0: 3d 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f  ==2) || sqlite3_
b7f0: 77 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23  win32_is_nt()).#
b800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
b810: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
b820: 6d 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63  mines if the mac
b830: 68 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20  hine is running 
b840: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e  a version of Win
b850: 64 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  dows.** based on
b860: 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a   the NT kernel..
b870: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
b880: 69 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29  in32_is_nt(void)
b890: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
b8a0: 57 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINRT.  /*.  ** 
b8b0: 4e 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20  NOTE: The WinRT 
b8c0: 73 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20  sub-platform is 
b8d0: 61 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74  always assumed t
b8e0: 6f 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  o be based on th
b8f0: 65 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20  e NT.  **       
b900: 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72  kernel..  */.  r
b910: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 53  eturn 1;.#elif S
b920: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
b930: 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f  ERSIONEX.  if( o
b940: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
b950: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
b960: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c  ite3_os_type, 0,
b970: 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65   0)==0 ){.#if de
b980: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b990: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
b9a0: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20   OSVERSIONINFOA 
b9b0: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
b9c0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
b9d0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
b9e0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
b9f0: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
ba00: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
ba10: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
ba20: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
ba30: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
ba40: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
ba50: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
ba60: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
ba70: 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64  : 1, 0);.#elif d
ba80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
ba90: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
baa0: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57    OSVERSIONINFOW
bab0: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66   sInfo;.    sInf
bac0: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
bad0: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
bae0: 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74  Info);.    osGet
baf0: 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66  VersionExW(&sInf
bb00: 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c  o);.    osInterl
bb10: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
bb20: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
bb30: 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28  _type,.        (
bb40: 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d  sInfo.dwPlatform
bb50: 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f  Id == VER_PLATFO
bb60: 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32  RM_WIN32_NT) ? 2
bb70: 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66   : 1, 0);.#endif
bb80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73  .  }.  return os
bb90: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bba0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bbb0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20  te3_os_type, 2, 
bbc0: 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c  2)==2;.#elif SQL
bbd0: 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72  ITE_TEST.  retur
bbe0: 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  n osInterlockedC
bbf0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
bc00: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
bc10: 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65   2, 2)==2;.#else
bc20: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
bc30: 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72   All sub-platfor
bc40: 6d 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74  ms where the Get
bc50: 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75  VersionEx[AW] fu
bc60: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a  nctions are.  **
bc70: 20 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65         deprecate
bc80: 64 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73  d are always ass
bc90: 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64  umed to be based
bca0: 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65   on the NT kerne
bcb0: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  l..  */.  return
bcc0: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   1;.#endif.}..#i
bcd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
bce0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
bcf0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
bd00: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
bd10: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
bd20: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
bd30: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
bd40: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
bd50: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bd60: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bd70: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bd90: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
bda0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bdb0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bdc0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bdd0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bde0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bdf0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
be00: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
be10: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
be20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
be30: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
be40: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
be50: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
be60: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
be70: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
be80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
be90: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
bea0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
beb0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
bec0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
bed0: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
bee0: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
bef0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
bf00: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
bf10: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
bf20: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
bf30: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
bf40: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
bf50: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
bf60: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
bf70: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
bf80: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
bf90: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
bfa0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
bfb0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
bfc0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
bfd0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bfe0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
bff0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
c000: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
c010: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
c020: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
c030: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
c040: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
c050: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
c060: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
c070: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
c080: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
c090: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
c0a0: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
c0b0: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
c0c0: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
c0d0: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
c0e0: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
c0f0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c100: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
c110: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
c120: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
c130: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
c140: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29  e block %p (%lu)
c150: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
c160: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
c170: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
c180: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
c190: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
c1a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
c1b0: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
c1c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c1d0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
c1e0: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
c1f0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
c200: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
c210: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
c220: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
c230: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
c240: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
c250: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
c260: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
c270: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
c280: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
c290: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
c2a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
c2b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
c2c0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
c2d0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
c2e0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
c2f0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c300: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c310: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
c320: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
c330: 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  es>=0 );.  if( !
c340: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20  pPrior ){.    p 
c350: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
c360: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c370: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
c380: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
c390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
c3a0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48  osHeapReAlloc(hH
c3b0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c3c0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
c3d0: 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42  rior, (SIZE_T)nB
c3e0: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
c3f0: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
c400: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
c410: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
c420: 25 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  %s %u bytes (%lu
c430: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
c450: 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c  ior ? "HeapReAll
c460: 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63  oc" : "HeapAlloc
c470: 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74  ", nBytes, osGet
c480: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
c4a0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
c4b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
c4c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c4d0: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
c4e0: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
c4f0: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  n, in bytes..*/.
c500: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
c510: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  mSize(void *p){.
c520: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
c530: 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77    SIZE_T n;..  w
c540: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
c550: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
c560: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
c570: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
c580: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
c590: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
c5a0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
c5b0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
c5c0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
c5d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
c5e0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
c5f0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c600: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
c610: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c620: 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69  AGS, p) );.#endi
c630: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
c640: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
c650: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
c660: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c670: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
c680: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
c690: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c6a0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c6b0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c6c0: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
c6d0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c6f0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c700: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
c710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c720: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
c730: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
c740: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
c750: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
c760: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
c770: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
c780: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
c790: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
c7a0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
c7b0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
c7c0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
c7d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
c7e0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
c7f0: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c800: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c810: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c820: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c830: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
c850: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
c860: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
c870: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
c880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
c890: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
c8a0: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
c8b0: 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   );..#if !SQLITE
c8c0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
c8d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
c8e0: 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69  REATE.  if( !pWi
c8f0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
c900: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49  ){.    DWORD dwI
c910: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c  nitialSize = SQL
c920: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
c930: 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57  NIT_SIZE;.    DW
c940: 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ORD dwMaximumSiz
c950: 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74  e = (DWORD)sqlit
c960: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
c970: 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77  Heap;.    if( dw
c980: 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29  MaximumSize==0 )
c990: 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75  {.      dwMaximu
c9a0: 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  mSize = SQLITE_W
c9b0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
c9c0: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ZE;.    }else if
c9d0: 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e  ( dwInitialSize>
c9e0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b  dwMaximumSize ){
c9f0: 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c  .      dwInitial
ca00: 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d  Size = dwMaximum
ca10: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
ca20: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
ca30: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
ca40: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
ca50: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20   dwInitialSize, 
ca90: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
caa0: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
cab0: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
cac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
cad0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
cae0: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
caf0: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
cb00: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
cb10: 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61  initSize=%lu, ma
cb20: 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20  xSize=%lu",.    
cb30: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
cb40: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
cb50: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
cb60: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a   dwInitialSize,.
cb70: 20 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69            dwMaxi
cb80: 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  mumSize);.      
cb90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cba0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
cbb0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
cbc0: 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a  >bOwned = TRUE;.
cbd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
cbe0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cbf0: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70  );.  }.#else.  p
cc00: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cc10: 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73  p = osGetProcess
cc20: 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70  Heap();.  if( !p
cc30: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cc40: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
cc50: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
cc60: 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c  M,.        "fail
cc70: 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73  ed to GetProcess
cc80: 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47  Heap (%lu)", osG
cc90: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
cca0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ccb0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
ccc0: 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  }.  pWinMemData-
ccd0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
cce0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e  .  assert( !pWin
ccf0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cd00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
cd10: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
cd20: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
cd30: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
cd40: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
cd50: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
cd60: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
cd70: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
cd80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
cd90: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
cda0: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
cdb0: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
cdc0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
cdd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
cde0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
cdf0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
ce00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ce10: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
ce20: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
ce30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
ce40: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
ce50: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
ce60: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
ce70: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
ce80: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
ce90: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
cea0: 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20  Data ) return;. 
ceb0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
cec0: 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49  Data->magic1==WI
ced0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20  NMEM_MAGIC1 );. 
cee0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
cef0: 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49  Data->magic2==WI
cf00: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a  NMEM_MAGIC2 );..
cf10: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
cf20: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
cf30: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
cf40: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
cf50: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
cf60: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
cf70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
cf80: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
cf90: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
cfa0: 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  ).    assert( os
cfb0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
cfc0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
cfd0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
cfe0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
cff0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
d000: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
d010: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
d020: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
d030: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
d040: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
d050: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
d060: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
d070: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
d080: 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  y (%lu), heap=%p
d090: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d0a0: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
d0b0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
d0c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
d0d0: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
d0e0: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
d0f0: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
d100: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
d110: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e  mData->hHeap = N
d120: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
d130: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * Populate the l
d140: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
d150: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74  allocation funct
d160: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a  ion pointers in.
d170: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
d180: 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f  Config.m with po
d190: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f  inters to the ro
d1a0: 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
d1b0: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75  ile. The.** argu
d1c0: 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68  ments specify th
d1d0: 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
d1e0: 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a  y to manage..**.
d1f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d200: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
d210: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
d220: 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72  (), and therefor
d230: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  e.** is not requ
d240: 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61  ired to be threa
d250: 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74  dsafe (it is not
d260: 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  )..*/.const sqli
d270: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
d280: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
d290: 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  n32(void){.  sta
d2a0: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
d2b0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69  3_mem_methods wi
d2c0: 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  nMemMethods = {.
d2d0: 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63      winMemMalloc
d2e0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65  ,.    winMemFree
d2f0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c  ,.    winMemReal
d300: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  loc,.    winMemS
d310: 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ize,.    winMemR
d320: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d  oundup,.    winM
d330: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d  emInit,.    winM
d340: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
d350: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20  &win_mem_data.  
d360: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e  };.  return &win
d370: 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76  MemMethods;.}..v
d380: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
d390: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
d3a0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
d3b0: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
d3c0: 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65  ALLOC, sqlite3Me
d3d0: 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a  mGetWin32());.}.
d3e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d3f0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
d400: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
d410: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
d420: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
d430: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ode..**.** Space
d440: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
d450: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
d460: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
d470: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d480: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
d490: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
d4a0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
d4b0: 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ext){.  int nCha
d4c0: 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64  r;.  LPWSTR zWid
d4d0: 65 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20  eText;..  nChar 
d4e0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
d4f0: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
d500: 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e   0, zText, -1, N
d510: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
d520: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
d530: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
d540: 57 69 64 65 54 65 78 74 20 3d 20 73 71 6c 69 74  WideText = sqlit
d550: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43  e3MallocZero( nC
d560: 68 61 72 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  har*sizeof(WCHAR
d570: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
d580: 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Text==0 ){.    r
d590: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d5a0: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
d5b0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
d5c0: 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20  UTF8, 0, zText, 
d5d0: 2d 31 2c 20 7a 57 69 64 65 54 65 78 74 2c 0a 20  -1, zWideText,. 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d600: 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
d610: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
d620: 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 54  ite3_free(zWideT
d630: 65 78 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54  ext);.    zWideT
d640: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
d650: 65 74 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b  eturn zWideText;
d660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
d670: 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  t a Microsoft Un
d680: 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20  icode string to 
d690: 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  UTF-8..**.** Spa
d6a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d6b0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d6c0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
d6d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d6e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
d6f0: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
d700: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
d710: 54 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79  Text){.  int nBy
d720: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  te;.  char *zTex
d730: 74 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  t;..  nByte = os
d740: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d750: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
d760: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30  zWideText, -1, 0
d770: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
d780: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 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 7a 54 65 78 74 20 3d 20 73 71 6c 69  }.  zText = sqli
d7b0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
d7c0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54  Byte );.  if( zT
d7d0: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d7e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
d7f0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d800: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
d810: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  TF8, 0, zWideTex
d820: 74 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42  t, -1, zText, nB
d830: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
d860: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d870: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d880: 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65  (zText);.    zTe
d890: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  xt = 0;.  }.  re
d8a0: 74 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f  turn zText;.}../
d8b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
d8c0: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
d8d0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
d8e0: 2c 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49  , using the ANSI
d8f0: 20 6f 72 20 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20   or OEM.** code 
d900: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
d910: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d920: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d930: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d940: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d950: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
d960: 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f  R winMbcsToUnico
d970: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
d980: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
d990: 69 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  i){.  int nByte;
d9a0: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 54  .  LPWSTR zMbcsT
d9b0: 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ext;.  int codep
d9c0: 61 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20  age = useAnsi ? 
d9d0: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
d9e0: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
d9f0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
da00: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
da10: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c   zText, -1, NULL
da20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
da50: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
da60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
da70: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 54   0;.  }.  zMbcsT
da80: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ext = sqlite3Mal
da90: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
daa0: 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
dab0: 20 20 69 66 28 20 7a 4d 62 63 73 54 65 78 74 3d    if( zMbcsText=
dac0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
dad0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
dae0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
daf0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
db00: 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  , 0, zText, -1, 
db10: 7a 4d 62 63 73 54 65 78 74 2c 0a 20 20 20 20 20  zMbcsText,.     
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
db40: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
db50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
db60: 5f 66 72 65 65 28 7a 4d 62 63 73 54 65 78 74 29  _free(zMbcsText)
db70: 3b 0a 20 20 20 20 7a 4d 62 63 73 54 65 78 74 20  ;.    zMbcsText 
db80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
db90: 6e 20 7a 4d 62 63 73 54 65 78 74 3b 0a 7d 0a 0a  n zMbcsText;.}..
dba0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
dbb0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
dbc0: 65 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75  e string to a mu
dbd0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
dbe0: 65 72 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 75 73  er string,.** us
dbf0: 69 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20  ing the ANSI or 
dc00: 4f 45 4d 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a  OEM code page..*
dc10: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
dc20: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
dc30: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
dc40: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
dc50: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
dc60: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
dc70: 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53  codeToMbcs(LPCWS
dc80: 54 52 20 7a 57 69 64 65 54 65 78 74 2c 20 69 6e  TR zWideText, in
dc90: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e  t useAnsi){.  in
dca0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
dcb0: 2a 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f  *zText;.  int co
dcc0: 64 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73 69  depage = useAnsi
dcd0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
dce0: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
dcf0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
dd00: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
dd10: 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d   0, zWideText, -
dd20: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
dd30: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 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 7a 54 65 78 74 20 3d 20  ;.  }.  zText = 
dd60: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
dd70: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
dd80: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
dd90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
dda0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
ddb0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
ddc0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
ddd0: 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78  deText, -1, zTex
dde0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
de10: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
de20: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
de30: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
de40: 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d    zText = 0;.  }
de50: 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b  .  return zText;
de60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
de70: 74 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  t a multi-byte c
de80: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
de90: 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20  to UTF-8..**.** 
dea0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
deb0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
dec0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
ded0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
dee0: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
def0: 68 61 72 20 2a 77 69 6e 4d 62 63 73 54 6f 55 74  har *winMbcsToUt
df00: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
df10: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
df20: 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  i){.  char *zTex
df30: 74 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20  tUtf8;.  LPWSTR 
df40: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
df50: 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54  pWide = winMbcsT
df60: 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c 20  oUnicode(zText, 
df70: 75 73 65 41 6e 73 69 29 3b 0a 20 20 69 66 28 20  useAnsi);.  if( 
df80: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
df90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dfa0: 0a 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77  .  zTextUtf8 = w
dfb0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
dfc0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
dfd0: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
dfe0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  de);.  return zT
dff0: 65 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  extUtf8;.}../*.*
e000: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
e010: 38 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75  8 string to a mu
e020: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
e030: 65 72 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  er string..**.**
e040: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
e050: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
e060: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
e070: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
e080: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
e090: 63 68 61 72 20 2a 77 69 6e 55 74 66 38 54 6f 4d  char *winUtf8ToM
e0a0: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
e0b0: 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e  zText, int useAn
e0c0: 73 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65  si){.  char *zTe
e0d0: 78 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52  xtMbcs;.  LPWSTR
e0e0: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
e0f0: 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38  mpWide = winUtf8
e100: 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29  ToUnicode(zText)
e110: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
e120: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
e130: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74  n 0;.  }.  zText
e140: 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Mbcs = winUnicod
e150: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
e160: 2c 20 75 73 65 41 6e 73 69 29 3b 0a 20 20 73 71  , useAnsi);.  sq
e170: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
e180: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
e190: 54 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  TextMbcs;.}../*.
e1a0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62  ** This is a pub
e1b0: 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20  lic wrapper for 
e1c0: 74 68 65 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  the winUtf8ToUni
e1d0: 63 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  code() function.
e1e0: 0a 2a 2f 0a 4c 50 57 53 54 52 20 73 71 6c 69 74  .*/.LPWSTR sqlit
e1f0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
e200: 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  _unicode(const c
e210: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66  har *zText){.#if
e220: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e230: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e240: 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  ( !zText ){.    
e250: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
e260: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
e270: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
e280: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
e290: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
e2a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
e2b0: 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74  itialize() ) ret
e2c0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
e2d0: 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f  return winUtf8To
e2e0: 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a  Unicode(zText);.
e2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e300: 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65   a public wrappe
e310: 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 6e 69  r for the winUni
e320: 63 6f 64 65 54 6f 55 74 66 38 28 29 20 66 75 6e  codeToUtf8() fun
e330: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e340: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e  sqlite3_win32_un
e350: 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c 50  icode_to_utf8(LP
e360: 43 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29  CWSTR zWideText)
e370: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e380: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e390: 0a 20 20 69 66 28 20 21 7a 57 69 64 65 54 65 78  .  if( !zWideTex
e3a0: 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  t ){.    (void)S
e3b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e3c0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e3d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
e3e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e3f0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
e400: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e410: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
e420: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e430: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
e440: 28 7a 57 69 64 65 54 65 78 74 29 3b 0a 7d 0a 0a  (zWideText);.}..
e450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
e460: 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66  public wrapper f
e470: 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f  or the winMbcsTo
e480: 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e  Utf8() function.
e490: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
e4a0: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
e4b0: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
e4c0: 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20  *zText){.#ifdef 
e4d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e4e0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
e4f0: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
e500: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e510: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e520: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
e530: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e540: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
e550: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
e560: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
e570: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
e580: 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  rn winMbcsToUtf8
e590: 28 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c  (zText, osAreFil
e5a0: 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a  eApisANSI());.}.
e5b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
e5c0: 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20   public wrapper 
e5d0: 66 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54  for the winMbcsT
e5e0: 6f 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e  oUtf8() function
e5f0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
e600: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
e610: 5f 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63  _utf8_v2(const c
e620: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
e630: 75 73 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66  useAnsi){.#ifdef
e640: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e650: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e660: 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f  zText ){.    (vo
e670: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
e680: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
e690: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
e6a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e6b0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
e6c0: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  f( sqlite3_initi
e6d0: 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e  alize() ) return
e6e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
e6f0: 75 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  urn winMbcsToUtf
e700: 38 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69  8(zText, useAnsi
e710: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e720: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
e730: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
e740: 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e  Utf8ToMbcs() fun
e750: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e760: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
e770: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
e780: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23   char *zText){.#
e790: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e7a0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e7b0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
e7c0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e7d0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e7e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
e7f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e800: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e810: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
e820: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
e830: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e840: 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38    return winUtf8
e850: 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 6f 73  ToMbcs(zText, os
e860: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
e870: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
e880: 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72  s is a public wr
e890: 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69  apper for the wi
e8a0: 6e 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75  nUtf8ToMbcs() fu
e8b0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
e8c0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
e8d0: 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63  tf8_to_mbcs_v2(c
e8e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
e8f0: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
e900: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e910: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e920: 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20   if( !zText ){. 
e930: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
e940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
e950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
e960: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
e970: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
e980: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
e990: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
e9a0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e9b0: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66  .  return winUtf
e9c0: 38 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 75  8ToMbcs(zText, u
e9d0: 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  seAnsi);.}../*.*
e9e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e9f0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
ea00: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
ea10: 5f 64 69 72 65 63 74 6f 72 79 20 28 62 65 6c 6f  _directory (belo
ea20: 77 29 3b 20 68 6f 77 65 76 65 72 2c 0a 2a 2a 20  w); however,.** 
ea30: 69 74 20 61 63 63 65 70 74 73 20 61 20 55 54 46  it accepts a UTF
ea40: 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69 6e  -8 string..*/.in
ea50: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
ea60: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 38 28 0a  set_directory8(.
ea70: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
ea80: 74 79 70 65 2c 20 2f 2a 20 49 64 65 6e 74 69 66  type, /* Identif
ea90: 69 65 72 20 66 6f 72 20 64 69 72 65 63 74 6f 72  ier for director
eaa0: 79 20 62 65 69 6e 67 20 73 65 74 20 6f 72 20 72  y being set or r
eab0: 65 73 65 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  eset */.  const 
eac0: 63 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 2f 2a  char *zValue  /*
ead0: 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 64   New value for d
eae0: 69 72 65 63 74 6f 72 79 20 62 65 69 6e 67 20 73  irectory being s
eaf0: 65 74 20 6f 72 20 72 65 73 65 74 20 2a 2f 0a 29  et or reset */.)
eb00: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72  {.  char **ppDir
eb10: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e  ectory = 0;.#ifn
eb20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
eb30: 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72  AUTOINIT.  int r
eb40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
eb50: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
eb60: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
eb70: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70  #endif.  if( typ
eb80: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
eb90: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
eba0: 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72  YPE ){.    ppDir
ebb0: 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65  ectory = &sqlite
ebc0: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
ebd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79  ;.  }else if( ty
ebe0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
ebf0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
ec00: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
ec10: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
ec20: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
ec30: 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
ec40: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
ec50: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
ec60: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
ec70: 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20  RY_TYPE.        
ec80: 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54    || type==SQLIT
ec90: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
eca0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b  ECTORY_TYPE.  );
ecb0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
ecc0: 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74  rectory || sqlit
ecd0: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
ece0: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20  e(*ppDirectory, 
ecf0: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
ed00: 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74 6f  .  if( ppDirecto
ed10: 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ry ){.    char *
ed20: 7a 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 69  zCopy = 0;.    i
ed30: 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61  f( zValue && zVa
ed40: 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  lue[0] ){.      
ed50: 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f  zCopy = sqlite3_
ed60: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 56  mprintf("%s", zV
ed70: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20  alue);.      if 
ed80: 28 20 7a 43 6f 70 79 3d 3d 30 20 29 7b 0a 20 20  ( zCopy==0 ){.  
ed90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
eda0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
edb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
edc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
edd0: 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  ppDirectory);.  
ede0: 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d    *ppDirectory =
edf0: 20 7a 43 6f 70 79 3b 0a 20 20 20 20 72 65 74 75   zCopy;.    retu
ee00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ee10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ee20: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
ee30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ee40: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
ee50: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
ee60: 5f 64 69 72 65 63 74 6f 72 79 20 28 62 65 6c 6f  _directory (belo
ee70: 77 29 3b 20 68 6f 77 65 76 65 72 2c 0a 2a 2a 20  w); however,.** 
ee80: 69 74 20 61 63 63 65 70 74 73 20 61 20 55 54 46  it accepts a UTF
ee90: 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69  -16 string..*/.i
eea0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
eeb0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 31 36  _set_directory16
eec0: 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  (.  unsigned lon
eed0: 67 20 74 79 70 65 2c 20 2f 2a 20 49 64 65 6e 74  g type, /* Ident
eee0: 69 66 69 65 72 20 66 6f 72 20 64 69 72 65 63 74  ifier for direct
eef0: 6f 72 79 20 62 65 69 6e 67 20 73 65 74 20 6f 72  ory being set or
ef00: 20 72 65 73 65 74 20 2a 2f 0a 20 20 63 6f 6e 73   reset */.  cons
ef10: 74 20 76 6f 69 64 20 2a 7a 56 61 6c 75 65 20 20  t void *zValue  
ef20: 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72  /* New value for
ef30: 20 64 69 72 65 63 74 6f 72 79 20 62 65 69 6e 67   directory being
ef40: 20 73 65 74 20 6f 72 20 72 65 73 65 74 20 2a 2f   set or reset */
ef50: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
ef60: 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 30 3b  char *zUtf8 = 0;
ef70: 0a 20 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b  .  if( zValue ){
ef80: 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c  .    zUtf8 = sql
ef90: 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f  ite3_win32_unico
efa0: 64 65 5f 74 6f 5f 75 74 66 38 28 7a 56 61 6c 75  de_to_utf8(zValu
efb0: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66  e);.    if( zUtf
efc0: 38 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  8==0 ) return SQ
efd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
efe0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
eff0: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
f000: 72 65 63 74 6f 72 79 38 28 74 79 70 65 2c 20 7a  rectory8(type, z
f010: 55 74 66 38 29 3b 0a 20 20 69 66 28 20 7a 55 74  Utf8);.  if( zUt
f020: 66 38 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  f8 ) sqlite3_fre
f030: 65 28 7a 55 74 66 38 29 3b 0a 20 20 72 65 74 75  e(zUtf8);.  retu
f040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f050: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
f060: 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ts the data dire
f070: 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d  ctory or the tem
f080: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
f090: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
f0a0: 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65   provided argume
f0b0: 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20 61  nts.  The type a
f0c0: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
f0d0: 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  1 in order to se
f0e0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69  t the.** data di
f0f0: 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20  rectory or 2 in 
f100: 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65  order to set the
f110: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
f120: 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75  tory.  The zValu
f130: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  e.** argument is
f140: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f150: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73   directory to us
f160: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  e.  The return v
f170: 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  alue will be.** 
f180: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
f190: 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20  cessful..*/.int 
f1a0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
f1b0: 74 5f 64 69 72 65 63 74 6f 72 79 28 0a 20 20 75  t_directory(.  u
f1c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 79 70  nsigned long typ
f1d0: 65 2c 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72  e, /* Identifier
f1e0: 20 66 6f 72 20 64 69 72 65 63 74 6f 72 79 20 62   for directory b
f1f0: 65 69 6e 67 20 73 65 74 20 6f 72 20 72 65 73 65  eing set or rese
f200: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 7a 56 61  t */.  void *zVa
f210: 6c 75 65 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  lue        /* Ne
f220: 77 20 76 61 6c 75 65 20 66 6f 72 20 64 69 72 65  w value for dire
f230: 63 74 6f 72 79 20 62 65 69 6e 67 20 73 65 74 20  ctory being set 
f240: 6f 72 20 72 65 73 65 74 20 2a 2f 0a 29 7b 0a 20  or reset */.){. 
f250: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
f260: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
f270: 6f 72 79 31 36 28 74 79 70 65 2c 20 7a 56 61 6c  ory16(type, zVal
f280: 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ue);.}../*.** Th
f290: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
f2a0: 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  f winGetLastErro
f2b0: 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rMsg.** is zero 
f2c0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
f2d0: 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
f2e0: 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
f2f0: 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
f300: 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
f310: 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
f320: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f330: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
f340: 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72  sg(DWORD lastErr
f350: 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  no, int nBuf, ch
f360: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20  ar *zBuf){.  /* 
f370: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65  FormatMessage re
f380: 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75  turns 0 on failu
f390: 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69  re.  Otherwise i
f3a0: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  t.  ** returns t
f3b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48  he number of TCH
f3c0: 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ARs written to t
f3d0: 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62  he output.  ** b
f3e0: 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67  uffer, excluding
f3f0: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67   the terminating
f400: 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f   null char..  */
f410: 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d  .  DWORD dwLen =
f420: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   0;.  char *zOut
f430: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49   = 0;..  if( osI
f440: 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
f450: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
f460: 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65   WCHAR zTempWide
f470: 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  [SQLITE_WIN32_MA
f480: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31  X_ERRMSG_CHARS+1
f490: 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  ];.    dwLen = o
f4a0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
f4b0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
f4c0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
f4f0: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
f500: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
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 20 20 6c 61 73 74 45 72 72           lastErr
f550: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20   zTempWide,.    
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
f5c0: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
f5d0: 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20  _CHARS,.        
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20       0);.#else. 
f600: 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57     LPWSTR zTempW
f610: 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ide = NULL;.    
f620: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
f630: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
f640: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
f650: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
f680: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
f690: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
f6c0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
f6d0: 20 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 4e 55 4c               NUL
f6f0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29          (LPWSTR)
f760: 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20   &zTempWide,.   
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65            0);.#e
f7b0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c  ndif.    if( dwL
f7c0: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
f7d0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
f7e0: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
f7f0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
f800: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
f810: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
f820: 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
f830: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
f840: 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71  pWide);.      sq
f850: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
f860: 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c  lloc();.#if !SQL
f870: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
f880: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
f890: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
f8a0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
f8b0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
f8c0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
f8d0: 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a  mpWide);.#endif.
f8e0: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
f8f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
f900: 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
f910: 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d     char *zTemp =
f920: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
f930: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
f940: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
f950: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
f960: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
f990: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
f9c0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
f9d0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
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 4e 55 4c 4c 2c 0a 20 20          NULL,.  
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 20 20 6c 61 73 74 45             lastE
fa20: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 30 2c 0a 20 20 20 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 28 4c 50 53 54 52 29 20 26 7a 54 65 6d     (LPSTR) &zTem
fa70: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
fac0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
fad0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
fae0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
faf0: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
fb00: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
fb10: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
fb20: 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62 63     zOut = winMbc
fb30: 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20 6f  sToUtf8(zTemp, o
fb40: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
fb50: 28 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ());.      sqlit
fb60: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
fb70: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
fb80: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
fb90: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
fba0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
fbb0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
fbc0: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
fbd0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
fbe0: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
fbf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
fc00: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
fc10: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c  f, "OsError 0x%l
fc20: 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72  x (%lu)", lastEr
fc30: 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
fc40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
fc50: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
fc60: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
fc70: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
fc80: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
fc90: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
fca0: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
fcb0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
fcc0: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
fcd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
fce0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
fcf0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
fd00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
fd10: 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
fd20: 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
fd30: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
fd40: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
fd50: 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
fd60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fd70: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
fd80: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
fd90: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
fda0: 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
fdb0: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
fdc0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
fdd0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
fde0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
fdf0: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
fe00: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
fe10: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
fe20: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 0a  equivalent from.
fe30: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
fe40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
fe50: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
fe60: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
fe70: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
fe80: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
fe90: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
fea0: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
feb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
fec0: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
fed0: 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65 20 74  TOPEN)..** The t
fee0: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
fef0: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
ff00: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
ff10: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
ff20: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
ff30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
ff40: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
ff50: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
ff60: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
ff70: 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
ff80: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
ff90: 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
ffa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
ffb0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
ffc0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
fff0: 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
10000 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
10010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
10020 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
10030 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10040 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
10050 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
10060 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
10070 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
10080 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
10090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
100a0 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
100b0 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
100c0 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
100f0 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
10100 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
10110 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
10120 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
10130 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
10140 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
10150 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10180 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
10190 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e  sg[0] = 0;.  win
101a0 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
101b0 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
101c0 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
101d0 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
101e0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
101f0 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
10200 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
10210 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
10220 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
10230 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
10240 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
10250 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
10260 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
10270 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
10280 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29  %d: (%lu) %s(%s)
10290 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
102a0 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
102b0 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
102c0 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
102d0 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
102e0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
102f0 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
10300 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
10310 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
10320 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
10330 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
10340 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
10350 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
10360 20 63 61 75 73 65 64 20 62 79 0a 2a 2a 20 61 6e   caused by.** an
10370 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  tivirus software
10380 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74  .  Also the init
10390 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65  ial delay before
103a0 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79   the first retry
103b0 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69  ..** The delay i
103c0 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c  ncreases linearl
103d0 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72  y with each retr
103e0 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
103f0 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
10400 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20  _RETRY.# define 
10410 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
10420 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64  RR_RETRY 10.#end
10430 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
10440 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
10450 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69  TRY_DELAY.# defi
10460 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
10470 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
10480 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74  Y 25.#endif.stat
10490 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
104a0 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  etry = SQLITE_WI
104b0 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b  N32_IOERR_RETRY;
104c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
104d0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
104e0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
104f0 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
10500 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69 6e  ../*.** The "win
10510 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20  IoerrCanRetry1" 
10520 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
10530 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
10540 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a 2a  particular I/O.*
10550 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62 74  * error code obt
10560 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61 73  ained via GetLas
10570 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69 67  tError() is elig
10580 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69  ible to be retri
10590 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74 20  ed.  It.** must 
105a0 61 63 63 65 70 74 20 74 68 65 20 65 72 72 6f 72  accept the error
105b0 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20 69   code DWORD as i
105c0 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  ts only argument
105d0 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74 75   and should retu
105e0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  rn.** non-zero i
105f0 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
10600 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   is transient in
10610 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65 20   nature and the 
10620 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65 73  operation.** res
10630 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65 6e  ponsible for gen
10640 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69 67  erating the orig
10650 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68 74  inal error might
10660 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62 65   succeed upon be
10670 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  ing.** retried. 
10680 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
10690 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f 75   this macro shou
106a0 6c 64 20 62 65 20 61 20 76 61 72 69 61 62 6c 65  ld be a variable
106b0 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ..**.** Addition
106c0 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e 61  ally, a macro na
106d0 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  med "winIoerrCan
106e0 52 65 74 72 79 32 22 20 6d 61 79 20 62 65 20 64  Retry2" may be d
106f0 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a 2a  efined.  If it.*
10700 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69 74  * is defined, it
10710 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74   will be consult
10720 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  ed only when the
10730 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72 72   macro "winIoerr
10740 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72 65  CanRetry1".** re
10750 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65  turns zero.  The
10760 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
10770 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63 6f  ry2" macro is co
10780 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e 61  mpletely optiona
10790 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65 20  l and.** may be 
107a0 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20  used to include 
107b0 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f 72  additional error
107c0 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 65   codes in the se
107d0 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  t that should.**
107e0 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 66   result in the f
107f0 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72 61  ailing I/O opera
10800 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72 69  tion being retri
10810 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
10820 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65 64  .  If.** defined
10830 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43  , the "winIoerrC
10840 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20  anRetry2" macro 
10850 6d 75 73 74 20 65 78 68 69 62 69 74 20 65 78 74  must exhibit ext
10860 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73 0a  ernal semantics.
10870 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  ** identical to 
10880 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77 69  those of the "wi
10890 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
108a0 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21   macro..*/.#if !
108b0 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72  defined(winIoerr
108c0 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66 69  CanRetry1).#defi
108d0 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  ne winIoerrCanRe
108e0 74 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d 45  try1(a) (((a)==E
108f0 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
10900 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ED)        || \.
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 20 20 20 20 20 28 28                ((
10930 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e  a)==ERROR_SHARIN
10940 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20  G_VIOLATION)    
10950 7c 7c 20 5c 0a 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 20 20                  
10970 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c     ((a)==ERROR_L
10980 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20  OCK_VIOLATION)  
10990 20 20 20 20 20 7c 7c 20 5c 0a 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 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
109c0 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49 53  ROR_DEV_NOT_EXIS
109d0 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  T)        || \. 
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 20 20 20 20 20 28 28 61               ((a
10a00 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d 45  )==ERROR_NETNAME
10a10 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20 20 7c  _DELETED)      |
10a20 7c 20 5c 0a 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 20 20 20                  
10a40 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45    ((a)==ERROR_SE
10a50 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20 20  M_TIMEOUT)      
10a60 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
10a90 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41  OR_NETWORK_UNREA
10aa0 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a  CHABLE)).#endif.
10ab0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64  ./*.** If a Read
10ac0 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46  File() or WriteF
10ad0 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75  ile() error occu
10ae0 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  rs, invoke this 
10af0 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65  routine.** to se
10b00 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62  e if it should b
10b10 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75  e retried.  Retu
10b20 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79  rn TRUE to retry
10b30 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
10b40 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69  ** to give up wi
10b50 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  th an error..*/.
10b60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
10b70 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e  tryIoerr(int *pn
10b80 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45  Retry, DWORD *pE
10b90 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65  rror){.  DWORD e
10ba0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10bb0 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65  r();.  if( *pnRe
10bc0 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74  try>=winIoerrRet
10bd0 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ry ){.    if( pE
10be0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
10bf0 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d  Error = e;.    }
10c00 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10c10 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65 72   }.  if( winIoer
10c20 72 43 61 6e 52 65 74 72 79 31 28 65 29 20 29 7b  rCanRetry1(e) ){
10c30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  .    sqlite3_win
10c40 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72  32_sleep(winIoer
10c50 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a  rRetryDelay*(1+*
10c60 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b  pnRetry));.    +
10c70 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72  +*pnRetry;.    r
10c80 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66  eturn 1;.  }.#if
10c90 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72   defined(winIoer
10ca0 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65 6c  rCanRetry2).  el
10cb0 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43  se if( winIoerrC
10cc0 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a 20  anRetry2(e) ){. 
10cd0 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
10ce0 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52  _sleep(winIoerrR
10cf0 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e  etryDelay*(1+*pn
10d00 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a  Retry));.    ++*
10d10 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74  pnRetry;.    ret
10d20 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
10d30 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  f.  if( pError )
10d40 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
10d50 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
10d60 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
10d70 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
10d80 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
10d90 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67  atic void winLog
10da0 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79  Ioerr(int nRetry
10db0 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
10dc0 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20   if( nRetry ){. 
10dd0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
10de0 51 4c 49 54 45 5f 4e 4f 54 49 43 45 2c 0a 20 20  QLITE_NOTICE,.  
10df0 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d      "delayed %dm
10e00 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69  s for lock/shari
10e10 6e 67 20 63 6f 6e 66 6c 69 63 74 20 61 74 20 6c  ng conflict at l
10e20 69 6e 65 20 25 64 22 2c 0a 20 20 20 20 20 20 77  ine %d",.      w
10e30 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
10e40 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79  y*nRetry*(nRetry
10e50 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e 6f 0a 20 20  +1)/2, lineno.  
10e60 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a    );.  }.}../*.*
10e70 2a 20 54 68 69 73 20 23 69 66 20 64 6f 65 73 20  * This #if does 
10e80 6e 6f 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20  not rely on the 
10e90 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
10ea0 64 65 66 69 6e 65 20 62 65 63 61 75 73 65 20 74  define because t
10eb0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
10ec0 69 6e 67 20 73 65 63 74 69 6f 6e 20 69 6e 20 22  ing section in "
10ed0 64 61 74 65 2e 63 22 20 63 61 6e 6e 6f 74 20 75  date.c" cannot u
10ee0 73 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  se it..*/.#if !d
10ef0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10f00 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 29 20 26 26  IT_LOCALTIME) &&
10f10 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
10f20 57 43 45 29 20 26 26 20 5c 0a 20 20 20 20 28 21  WCE) && \.    (!
10f30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
10f40 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
10f50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53  I) || !SQLITE_MS
10f60 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
10f70 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43  )./*.** The MSVC
10f80 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20   CRT on Windows 
10f90 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CE may not have 
10fa0 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
10fb0 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 20 64 65  nction..** So de
10fc0 66 69 6e 65 20 61 20 73 75 62 73 74 69 74 75 74  fine a substitut
10fd0 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63 6c 75 64 65  e..*/.#  include
10fe0 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74   <time.h>.struct
10ff0 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63   tm *__cdecl loc
11000 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d  altime(const tim
11010 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74  e_t *t).{.  stat
11020 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a  ic struct tm y;.
11030 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20    FILETIME uTm, 
11040 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d  lTm;.  SYSTEMTIM
11050 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33  E pTm;.  sqlite3
11060 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36  _int64 t64;.  t6
11070 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20  4 = *t;.  t64 = 
11080 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36  (t64 + 116444736
11090 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20  00)*10000000;.  
110a0 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  uTm.dwLowDateTim
110b0 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  e = (DWORD)(t64 
110c0 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20  & 0xFFFFFFFF);. 
110d0 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54   uTm.dwHighDateT
110e0 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34  ime= (DWORD)(t64
110f0 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c   >> 32);.  osFil
11100 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
11110 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b  Time(&uTm,&lTm);
11120 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  .  osFileTimeToS
11130 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26  ystemTime(&lTm,&
11140 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61  pTm);.  y.tm_yea
11150 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20  r = pTm.wYear - 
11160 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e  1900;.  y.tm_mon
11170 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20   = pTm.wMonth - 
11180 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d  1;.  y.tm_wday =
11190 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b   pTm.wDayOfWeek;
111a0 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70  .  y.tm_mday = p
111b0 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f  Tm.wDay;.  y.tm_
111c0 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72  hour = pTm.wHour
111d0 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70  ;.  y.tm_min = p
111e0 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e  Tm.wMinute;.  y.
111f0 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65  tm_sec = pTm.wSe
11200 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26  cond;.  return &
11210 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
11220 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11230 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11280 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74  his section cont
11290 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69  ains code for Wi
112a0 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 64 65  nCE only..*/.#de
112b0 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  fine HANDLE_TO_W
112c0 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69  INFILE(a) (winFi
112d0 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b  le*)&((char*)a)[
112e0 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77  -(int)offsetof(w
112f0 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a  inFile,h)]../*.*
11300 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b  * Acquire a lock
11310 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68   on the handle h
11320 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11330 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
11340 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20  e(HANDLE h){.   
11350 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20  DWORD dwErr;.   
11360 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20  do {.     dwErr 
11370 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  = osWaitForSingl
11380 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e  eObject(h, INFIN
11390 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65  ITE);.   } while
113a0 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f   (dwErr != WAIT_
113b0 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72  OBJECT_0 && dwEr
113c0 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f  r != WAIT_ABANDO
113d0 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  NED);.}./*.** Re
113e0 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71  lease a lock acq
113f0 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75  uired by winceMu
11400 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a  texAcquire().*/.
11410 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74  #define winceMut
11420 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c  exRelease(h) Rel
11430 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a  easeMutex(h)../*
11440 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d  .** Create the m
11450 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20  utex and shared 
11460 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20  memory used for 
11470 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66  locking in the f
11480 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
11490 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  r pFile.*/.stati
114a0 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74  c int winceCreat
114b0 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
114c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
114d0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
114e0 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
114f0 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44  PWSTR zName;.  D
11500 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
11510 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d    BOOL bLogged =
11520 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62   FALSE;.  BOOL b
11530 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20  Init = TRUE;..  
11540 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54  zName = winUtf8T
11550 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
11560 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
11570 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
11580 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
11590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
115a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
115b0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  T;.  }..  /* Ini
115c0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
115d0 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
115e0 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
115f0 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
11600 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
11610 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
11620 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
11630 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
11640 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
11650 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
11660 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
11670 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
11680 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
11690 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
116a0 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
116b0 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
116c0 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
116d0 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
116e0 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
116f0 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
11700 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
11710 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
11720 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
11730 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
11740 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11750 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11760 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
11770 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
11780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
11790 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
117a0 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
117b0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
117e0 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
117f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
11800 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
11810 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
11820 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
11830 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
11840 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
11850 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
11860 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
11870 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
11880 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
11890 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
118a0 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
118b0 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
118c0 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
118d0 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
118e0 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
118f0 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
11900 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
11910 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
11920 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
11930 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
11940 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
11950 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
11960 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
11970 20 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 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
119a0 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
119b0 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
119f0 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
11a00 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
11a10 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
11a20 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
11a30 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
11a40 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
11a50 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
11a60 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11a70 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
11a80 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
11a90 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
11aa0 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
11ab0 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
11ac0 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
11ad0 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
11ae0 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
11af0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
11b00 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
11b10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
11b20 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
11b30 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
11b40 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
11b50 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
11b60 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
11b70 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
11b80 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
11b90 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
11ba0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
11bb0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
11bc0 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
11bd0 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
11be0 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
11bf0 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
11c00 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
11c10 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
11c20 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
11c30 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
11c40 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
11c50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
11c60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11c80 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
11c90 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
11ca0 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
11cb0 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
11cc0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
11cd0 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
11ce0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
11cf0 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
11d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
11d10 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
11d20 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
11d30 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
11d40 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
11d50 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11d60 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
11d70 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
11d80 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
11d90 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
11da0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
11db0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
11dc0 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
11dd0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
11df0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
11e00 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
11e10 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
11e20 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
11e30 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
11e40 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11e50 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
11e60 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
11e70 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
11e80 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
11e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11ea0 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
11eb0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
11ec0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
11ed0 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
11ee0 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
11ef0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
11f00 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
11f10 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
11f20 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
11f30 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
11f40 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
11f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
11f70 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
11f80 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
11f90 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
11fa0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
11fb0 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
11fc0 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
11fd0 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
11fe0 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
11ff0 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
12000 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
12010 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
12020 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
12030 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
12040 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
12050 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
12060 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
12070 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
12080 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
12090 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
120a0 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
120b0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
120c0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
120d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
120e0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
120f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12100 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
12110 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
12120 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12130 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
12140 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
12150 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
12160 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
12170 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
12180 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
12190 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
121a0 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
121b0 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
121c0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
121d0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
121e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
121f0 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
12200 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
12210 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
12220 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
12230 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
12240 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
12250 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
12260 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
12270 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
12280 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
12290 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
122a0 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
122b0 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
122c0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
122d0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
122e0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
122f0 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
12300 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
12310 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
12320 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
12330 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
12340 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
12350 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
12360 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
12370 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
12380 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
12390 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
123a0 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
123b0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
123c0 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
123d0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
123e0 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
123f0 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
12400 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
12410 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
12420 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
12430 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12440 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
12450 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12460 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
12470 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
12480 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
12490 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
124a0 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
124b0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
124c0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
124d0 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
124e0 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
124f0 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12500 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
12510 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
12520 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
12530 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
12540 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
12550 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
12560 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
12570 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
12580 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
12590 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
125a0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
125b0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
125c0 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
125d0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
125e0 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
125f0 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
12600 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
12610 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
12620 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
12630 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
12640 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
12650 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
12660 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
12670 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
12680 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
12690 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
126a0 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
126b0 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
126c0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
126d0 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
126e0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
126f0 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
12700 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12710 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
12720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12730 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12740 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
12750 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
12760 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
12770 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
12780 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
12790 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
127a0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
127b0 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
127c0 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
127d0 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
127e0 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
127f0 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
12800 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
12810 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
12820 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
12830 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
12840 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
12850 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
12860 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
12870 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
12880 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12890 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
128a0 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
128b0 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
128c0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
128d0 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
128e0 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
128f0 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
12900 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
12910 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
12920 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12930 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
12940 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12950 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
12960 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
12970 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
12980 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
12990 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
129a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
129b0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
129c0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
129d0 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
129e0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
129f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
12a00 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
12a10 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
12a20 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
12a30 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
12a40 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
12a50 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
12a60 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
12a70 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
12a80 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
12a90 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
12aa0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
12ab0 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
12ac0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
12ad0 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
12ae0 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
12af0 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
12b00 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
12b10 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
12b20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
12b30 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
12b40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12b50 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
12b60 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
12b70 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
12b80 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
12b90 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
12ba0 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
12bb0 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
12bc0 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
12bd0 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
12be0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
12bf0 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
12c00 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
12c10 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
12c20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
12c30 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
12c40 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
12c50 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
12c60 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
12c70 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
12c80 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
12c90 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
12ca0 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
12cb0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
12cc0 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
12cd0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12ce0 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
12cf0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
12d00 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12d10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
12d20 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
12d30 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
12d40 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
12d50 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12d60 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
12d70 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
12d80 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
12d90 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
12da0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
12db0 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
12dc0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
12dd0 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
12de0 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
12df0 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
12e00 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12e10 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
12e20 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12e30 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
12e40 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
12e50 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12e60 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
12e70 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
12e80 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
12e90 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
12ea0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12eb0 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
12ed0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
12ee0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
12ef0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
12f00 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
12f10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
12f20 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
12f30 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
12f40 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
12f50 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
12f60 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
12f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
12f80 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
12f90 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
12fa0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
12fb0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
12fc0 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
12fd0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
12fe0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
12ff0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
13000 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
13010 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
13020 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13030 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
13040 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
13050 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
13060 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
13070 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
13080 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
13090 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
130a0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
130b0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
130c0 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
130d0 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
130e0 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
130f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
13140 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13150 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
13160 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
13170 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
13180 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
13190 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
131a0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
131b0 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
131c0 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
131d0 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
131e0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
131f0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
13200 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
13210 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13220 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
13230 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
13240 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
13250 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
13260 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
13270 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
13280 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
13290 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
132a0 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
132b0 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
132c0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
132d0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
132e0 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
132f0 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
13300 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
13310 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
13320 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
13330 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
13340 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
13350 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
13360 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
13370 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
13380 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
13390 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
133a0 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
133b0 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
133c0 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
133d0 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
133e0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
133f0 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
13400 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
13410 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
13420 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
13430 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
13440 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
13450 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
13460 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
13470 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
13480 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
13490 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
134a0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
134b0 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
134c0 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
134d0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
134e0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
134f0 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
13500 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13510 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
13520 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
13530 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
13540 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
13550 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
13560 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
13570 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
13580 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
13590 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
135a0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
135b0 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
135e0 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
135f0 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
13600 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
13610 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
13620 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
13630 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
13640 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
13650 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
13660 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
13670 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
13680 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
13690 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
136a0 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
136b0 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
136c0 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
136d0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
136e0 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
136f0 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
13700 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
13710 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
13740 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
137a0 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
137b0 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
137c0 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
137d0 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
137e0 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
137f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
13800 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
13810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13850 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
13860 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
13870 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
13880 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
13890 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
138a0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
138b0 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
138c0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
138d0 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
138e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
138f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
13900 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
13910 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
13920 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
13930 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
13940 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
13950 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
13960 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
13970 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
13980 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
13990 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
139a0 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
139b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
139c0 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
139d0 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
139e0 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
139f0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13a00 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
13a10 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
13a20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
13a30 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
13a40 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
13a50 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a70 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
13a80 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
13a90 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
13aa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13ab0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
13ac0 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
13ad0 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
13ae0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13b00 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
13b10 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
13b20 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
13b30 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
13b40 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
13b50 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
13b60 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
13b70 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
13b80 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
13b90 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
13ba0 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
13bb0 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
13bc0 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
13bd0 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
13be0 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
13bf0 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
13c00 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
13c10 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
13c20 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
13c30 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
13c40 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
13c50 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
13c60 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
13c70 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
13c80 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
13c90 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
13ca0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
13cb0 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
13cc0 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
13cd0 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
13ce0 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
13cf0 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
13d00 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
13d10 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
13d20 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
13d30 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
13d40 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
13d50 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
13d60 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
13d70 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
13d80 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
13d90 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
13da0 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
13db0 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
13dc0 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
13dd0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13de0 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
13df0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
13e00 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
13e10 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
13e20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
13e30 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
13e40 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13e50 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
13e60 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
13e70 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
13e80 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
13e90 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
13ea0 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
13eb0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
13ec0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
13ed0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
13ee0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
13ef0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
13f00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
13f10 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
13f20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
13f30 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
13f40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
13f50 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
13f60 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
13f70 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
13f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
13f90 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
13fa0 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13fc0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
13fd0 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
13fe0 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
13ff0 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
14000 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
14010 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
14020 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
14030 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
14040 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
14050 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14060 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14070 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
14080 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14090 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
140a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
140b0 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
140c0 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
140d0 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
140e0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
140f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14100 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
14110 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
14120 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
14130 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
14140 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14150 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14160 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
14170 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
14180 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14190 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
141a0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
141b0 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
141c0 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
141d0 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
141e0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
141f0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
14200 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
14210 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
14220 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
14230 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
14240 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
14250 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
14260 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
14270 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
14280 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
14290 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
142a0 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
142b0 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
142c0 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
142d0 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
142e0 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
142f0 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
14300 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
14310 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
14320 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
14330 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
14340 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
14350 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
14360 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
14370 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
14380 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
14390 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
143a0 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
143b0 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
143c0 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
143d0 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
143e0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
143f0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
14400 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14410 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
14420 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
14430 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14440 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
14450 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
14460 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14470 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
14480 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
14490 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
144a0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
144b0 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
144c0 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
144d0 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
144e0 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
144f0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
14500 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ile=%p\n",.     
14510 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
14520 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14530 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
14540 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
14550 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
14560 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
14570 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
14580 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
14590 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
145a0 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
145b0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
145c0 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
145d0 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
145e0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
145f0 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
14600 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
14610 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
14620 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
14630 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
14640 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
14650 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
14660 54 53 20 33 0a 20 20 7b 0a 20 20 20 20 77 69 6e  TS 3.  {.    win
14670 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70 70  VfsAppData *pApp
14680 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41 70  Data = (winVfsAp
14690 70 44 61 74 61 2a 29 70 46 69 6c 65 2d 3e 70 56  pData*)pFile->pV
146a0 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20  fs->pAppData;.  
146b0 20 20 69 66 28 20 70 41 70 70 44 61 74 61 3d 3d    if( pAppData==
146c0 4e 55 4c 4c 20 7c 7c 20 21 70 41 70 70 44 61 74  NULL || !pAppDat
146d0 61 2d 3e 62 4e 6f 4c 6f 63 6b 20 29 7b 0a 20 20  a->bNoLock ){.  
146e0 20 20 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79      winceDestroy
146f0 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
14700 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69   }.  }.  if( pFi
14710 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
14720 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  se ){.    int cn
14730 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
14740 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44  (.           osD
14750 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65  eleteFileW(pFile
14760 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14770 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
14780 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
14790 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  tesW(pFile->zDel
147a0 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66  eteOnClose)!=0xf
147b0 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20  fffffff.        
147c0 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
147d0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
147e0 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
147f0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
14800 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
14810 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
14820 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
14830 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
14840 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
14850 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14860 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14870 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
14880 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
14890 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
148a0 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  (-1);.  OSTRACE(
148b0 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c  ("CLOSE pid=%lu,
148c0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
148d0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
148e0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
148f0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
14900 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
14910 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
14920 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
14930 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
14940 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  OK.            :
14950 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14960 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
14970 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14980 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
149a0 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e  nClose", pFile->
149b0 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
149c0 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
149d0 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
149e0 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
149f0 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
14a00 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
14a10 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
14a20 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
14a30 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
14a40 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
14a50 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64  atic int winRead
14a60 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
14a70 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
14a80 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66  * File to read f
14a90 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  rom */.  void *p
14aa0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
14ab0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e      /* Write con
14ac0 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62  tent into this b
14ad0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  uffer */.  int a
14ae0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
14af0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14b00 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
14b10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
14b20 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
14b30 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
14b40 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74  g at this offset
14b50 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49   */.){.#if !SQLI
14b60 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
14b70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
14b80 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
14b90 45 44 29 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  ED).  OVERLAPPED
14ba0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
14bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
14bc0 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
14bd0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
14be0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14bf0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
14c00 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
14c10 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14c40 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
14c50 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
14c60 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
14c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
14c90 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
14ca0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
14cb0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
14cc0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
14cd0 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  >=0 );.  Simulat
14ce0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
14cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
14d00 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
14d10 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
14d20 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
14d30 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
14d40 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20  nt=%d, ".       
14d50 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64      "offset=%lld
14d60 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73  , lock=%d\n", os
14d70 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14d80 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20  sId(), pFile,.  
14d90 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14da0 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
14db0 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
14dc0 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
14dd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
14de0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
14df0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
14e00 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74  his read request
14e10 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
14e20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
14e30 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
14e40 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
14e50 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
14e60 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
14e70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
14e80 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
14e90 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
14ea0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
14eb0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
14ec0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
14ed0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
14ee0 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  t], amt);.      
14ef0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d  OSTRACE(("READ-M
14f00 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
14f10 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14f20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
14f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14f40 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
14f50 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
14f60 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
14f70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f80 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
14f90 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
14fa0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
14fb0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
14fc0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
14fd0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
14fe0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
14ff0 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
15000 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
15010 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
15020 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
15030 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
15040 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
15050 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
15060 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
15070 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65  _WINCE || define
15080 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
15090 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
150a0 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
150b0 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29  pFile, offset) )
150c0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
150d0 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
150e0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
150f0 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c   rc=SQLITE_FULL\
15100 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15110 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
15120 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15130 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
15150 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
15160 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
15170 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
15180 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
15190 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28  .#else.  memset(
151a0 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
151b0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
151c0 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  D));.  overlappe
151d0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
151e0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
151f0 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61  fffff);.  overla
15200 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
15210 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
15220 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
15230 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f  ff);.  while( !o
15240 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
15250 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
15260 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70  nRead, &overlapp
15270 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ed) &&.         
15280 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
15290 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45  !=ERROR_HANDLE_E
152a0 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  OF ){.#endif.   
152b0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
152c0 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74  ;.    if( winRet
152d0 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
152e0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
152f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
15300 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
15310 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f  lastErrno;.    O
15320 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
15330 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
15340 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15350 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e  ITE_IOERR_READ\n
15360 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15370 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
15380 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
15390 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
153a0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
153b0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
153c0 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
153d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
153f0 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
15400 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77  >zPath);.  }.  w
15410 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
15420 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  y, __LINE__);.  
15430 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44  if( nRead<(DWORD
15440 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55  )amt ){.    /* U
15450 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
15460 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
15470 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
15480 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
15490 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64  har*)pBuf)[nRead
154a0 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29  ], 0, amt-nRead)
154b0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
154c0 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
154d0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
154e0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
154f0 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a  _SHORT_READ\n",.
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
15510 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
15520 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
15530 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
15540 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15550 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
15560 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ..  OSTRACE(("RE
15570 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
15580 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
15590 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
155a0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
155b0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
155c0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
155d0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
155e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
155f0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
15600 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
15610 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
15620 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15630 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
15640 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
15650 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
15660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15670 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
15680 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
15690 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
156a0 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
156b0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
156c0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
156d0 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
156e0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
156f0 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15720 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
15730 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
15740 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
15750 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
15760 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
15770 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
15780 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
15790 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
157a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
157b0 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63   if error has oc
157c0 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c  curred, else fal
157d0 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  se */.  winFile 
157e0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
157f0 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
15800 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
15810 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
15820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15830 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73  umber of retries
15840 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61   */..  assert( a
15850 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
15860 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
15870 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
15880 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15890 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c  _WRITE);.  Simul
158a0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
158b0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46  (return SQLITE_F
158c0 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  ULL);..  OSTRACE
158d0 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
158e0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
158f0 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20  =%p, buffer=%p, 
15900 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20  amount=%d, ".   
15910 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d          "offset=
15920 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
15930 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
15940 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15960 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
15970 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
15980 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
15990 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
159a0 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
159b0 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
159c0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
159d0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
159e0 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
159f0 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
15a00 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
15a10 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
15a20 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
15a30 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
15a40 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
15a50 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
15a60 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
15a70 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
15a80 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
15a90 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
15aa0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
15ab0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
15ac0 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
15ad0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
15ae0 22 57 52 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d  "WRITE-MMAP pid=
15af0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
15b00 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15b10 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
15b20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15b30 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15b40 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15b50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
15b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
15b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
15b80 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70   nCopy = (int)(p
15b90 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
15ba0 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
15bb0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
15bc0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
15bd0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
15be0 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
15bf0 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
15c00 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
15c10 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
15c20 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
15c30 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
15c40 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
15c50 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
15c60 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
15c70 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
15c80 50 50 45 44 29 0a 20 20 72 63 20 3d 20 77 69 6e  PPED).  rc = win
15c90 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
15ca0 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
15cb0 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20  c==0 ){.#else.  
15cc0 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  {.#endif.#if !SQ
15cd0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
15ce0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15cf0 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
15d00 50 50 45 44 29 0a 20 20 20 20 4f 56 45 52 4c 41  PPED).    OVERLA
15d10 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
15d20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
15d30 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
15d40 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
15d50 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75     u8 *aRem = (u
15d60 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20  8 *)pBuf;       
15d70 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20   /* Data yet to 
15d80 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
15d90 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74    int nRem = amt
15da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15db0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
15dc0 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
15dd0 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  tten */.    DWOR
15de0 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  D nWrite;       
15df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
15e00 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61  es written by ea
15e10 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63  ch WriteFile() c
15e20 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  all */.    DWORD
15e30 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
15e40 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75  ERROR;   /* Valu
15e50 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
15e60 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
15e70 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
15e80 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
15e90 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
15ea0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
15eb0 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
15ec0 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
15ed0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
15ee0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
15ef0 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
15f00 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
15f10 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
15f20 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
15f30 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
15f40 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
15f50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68  ;.#endif..    wh
15f60 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23  ile( nRem>0 ){.#
15f70 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15f80 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  CE || defined(SQ
15f90 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
15fa0 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20  ERLAPPED).      
15fb0 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
15fc0 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
15fd0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
15fe0 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20  0) ){.#else.    
15ff0 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
16000 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
16010 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
16020 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29  , &overlapped) )
16030 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  {.#endif.       
16040 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65   if( winRetryIoe
16050 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
16060 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
16070 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ue;.        brea
16080 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
16090 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
160a0 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44  =0 || nWrite<=(D
160b0 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20  WORD)nRem );.   
160c0 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30     if( nWrite==0
160d0 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52   || nWrite>(DWOR
160e0 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  D)nRem ){.      
160f0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
16100 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
16110 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16120 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49       }.#if !SQLI
16130 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
16140 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
16150 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
16160 45 44 29 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ED).      offset
16170 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
16180 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
16190 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
161a0 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
161b0 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  );.      overlap
161c0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
161d0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
161e0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
161f0 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  f);.#endif.     
16200 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
16210 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
16220 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
16230 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
16240 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
16250 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
16260 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
16270 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16280 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
16290 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
162a0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
162b0 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
162c0 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
162d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
162e0 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
162f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
16300 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20  "WRITE pid=%lu, 
16310 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
16320 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
16330 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  L\n",.          
16340 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16350 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16360 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
16370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
16380 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
16390 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61  _FULL, pFile->la
163a0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70    "winWrite1", p
163d0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
163e0 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28    }.    OSTRACE(
163f0 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
16400 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16410 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
16420 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20  ERR_WRITE\n",.  
16430 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16440 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16450 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16460 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16470 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
16480 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
16490 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
164a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
164b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
164c0 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite2", pFile->z
164d0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
164e0 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
164f0 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f  nRetry, __LINE__
16500 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
16510 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
16520 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
16530 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
16540 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
16550 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16560 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16570 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
16580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
165a0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
165b0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
165c0 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
165d0 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71  t winTruncate(sq
165e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
165f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
16600 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  yte){.  winFile 
16610 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
16620 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
16630 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  handle object */
16640 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16650 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
16660 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16670 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  e for this funct
16680 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ion */.  DWORD l
16690 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73  astErrno;..  ass
166a0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
166b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
166c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
166d0 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20  ERR_TRUNCATE);. 
166e0 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
166f0 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
16700 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
16710 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
16720 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
16730 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
16740 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
16750 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  , pFile->h, nByt
16760 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
16770 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
16780 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
16790 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
167a0 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
167b0 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
167c0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
167d0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
167e0 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
167f0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
16800 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
16810 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
16820 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
16830 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
16840 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
16850 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
16860 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
16870 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
16880 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
16890 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
168a0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
168b0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
168c0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
168d0 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
168e0 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
168f0 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
16900 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
16910 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
16920 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
16930 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
16940 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
16950 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16960 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
16970 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
169a0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
169b0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
169c0 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
169d0 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
169e0 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
169f0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
16a00 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
16a10 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
16a20 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
16a30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
16a40 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
16a50 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
16a60 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
16a70 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
16a80 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
16a90 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
16aa0 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
16ab0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
16ac0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
16ad0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
16ae0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
16af0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
16b00 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
16b10 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
16b20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
16b30 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
16b40 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
16b50 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
16b60 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
16b70 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
16b80 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
16b90 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
16ba0 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
16bb0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
16bc0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
16bd0 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
16be0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
16bf0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
16c00 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
16c10 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
16c20 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c  "TRUNCATE pid=%l
16c30 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
16c40 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%p, rc=%s\n",.
16c50 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16c60 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16c70 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16c80 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
16c90 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
16ca0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
16cb0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
16cc0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
16cd0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
16ce0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
16cf0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
16d00 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
16d10 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
16d20 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
16d30 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
16d40 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
16d50 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
16d60 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
16d70 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
16d80 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
16d90 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
16da0 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
16db0 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
16dc0 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
16dd0 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
16de0 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
16df0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16e00 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66   flags){.#ifndef
16e10 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
16e20 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f    /*.  ** Used o
16e30 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  nly when SQLITE_
16e40 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
16e50 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  efined..   */.  
16e60 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a  BOOL rc;.#endif.
16e70 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
16e80 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  BUG) || !defined
16e90 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
16ea0 20 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e 65   || \.    define
16eb0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53  d(SQLITE_HAVE_OS
16ec0 5f 54 52 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a  _TRACE).  /*.  *
16ed0 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49  * Used when SQLI
16ee0 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
16ef0 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79  t defined and by
16f00 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e   the assert() an
16f10 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43  d/or.  ** OSTRAC
16f20 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a  E() macros..   *
16f30 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
16f40 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
16f50 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  d;.#else.  UNUSE
16f60 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
16f70 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
16f80 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a  t( pFile );.  /*
16f90 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
16fa0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
16fb0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
16fc0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
16fd0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
16fe0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
16ff0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
17000 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17010 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
17020 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
17030 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
17040 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
17050 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
17060 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
17070 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
17080 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
17090 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
170a0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
170b0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
170c0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
170d0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
170e0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
170f0 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  YNC pid=%lu, pFi
17100 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
17110 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25  flags=%x, lock=%
17120 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
17130 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
17140 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
17150 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73   pFile->h, flags
17160 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17170 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
17180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17190 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41  TEST.  UNUSED_PA
171a0 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
171b0 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61  #else.  if( (fla
171c0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
171d0 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20  _SYNC_FULL ){.  
171e0 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79    sqlite3_fullsy
171f0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a  nc_count++;.  }.
17200 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
17210 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
17220 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
17230 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
17240 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
17250 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
17260 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
17270 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
17280 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52  E_NO_SYNC.  OSTR
17290 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70  ACE(("SYNC-NOP p
172a0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
172b0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
172c0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
172d0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
172e0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
172f0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
17300 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17310 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69 66  TE_OK;.#else.#if
17320 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17330 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
17340 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
17350 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 46 6c 75  ){.    if( osFlu
17360 73 68 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  shViewOfFile(pFi
17370 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20  le->pMapRegion, 
17380 30 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  0) ){.      OSTR
17390 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20  ACE(("SYNC-MMAP 
173a0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
173b0 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
173c0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
173d0 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 4f 4b     "rc=SQLITE_OK
173e0 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e  \n", osGetCurren
173f0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20  tProcessId(),.  
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
17410 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  le, pFile->pMapR
17420 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 65 6c  egion));.    }el
17430 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
17440 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
17450 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
17460 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
17470 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75  YNC-MMAP pid=%lu
17480 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70  , pFile=%p, pMap
17490 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
174a0 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d              "rc=
174b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
174c0 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  P\n", osGetCurre
174d0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20  ntProcessId(),. 
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
174f0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  ile, pFile->pMap
17500 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  Region));.      
17510 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
17520 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
17530 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
17540 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 22 77 69 6e 53 79 6e 63 31 22 2c 20 70 46 69   "winSync1", pFi
17570 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
17580 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
17590 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
175a0 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
175b0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
175c0 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
175d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
175e0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
175f0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
17600 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
17610 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
17620 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
17630 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
17640 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
17650 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
17660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
17670 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
17680 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17690 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
176a0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
176b0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
176c0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
176d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
176e0 4e 43 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  NC\n",.         
176f0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
17700 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
17710 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
17720 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
17730 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
17740 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65  ERR_FSYNC, pFile
17750 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 20 20 20 20 22 77 69 6e 53 79 6e 63 32 22 2c 20      "winSync2", 
17780 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
17790 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
177a0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
177b0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
177c0 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
177d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
177e0 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
177f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
17800 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
17810 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
17820 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
17830 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
17840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
17850 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
17860 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d   assert( pSize!=
17870 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
17880 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
17890 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
178a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
178b0 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
178c0 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ze=%p\n", pFile-
178d0 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69  >h, pSize));..#i
178e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
178f0 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
17900 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
17910 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
17920 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
17930 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
17940 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
17950 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
17980 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
17990 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
179a0 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
179b0 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
179c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
179d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
179e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
179f0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
17a00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
17a10 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
17a20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
17a50 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
17a60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
17a70 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
17a80 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
17a90 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
17aa0 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
17ab0 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
17ac0 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
17ad0 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
17ae0 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
17af0 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
17b00 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
17b10 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
17b20 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
17b30 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
17b40 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
17b50 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
17b60 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
17b70 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
17b80 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
17b90 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17ba0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
17bb0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
17bc0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
17bd0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
17be0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
17c10 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17c20 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
17c30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
17c40 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
17c50 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64  =%p, *pSize=%lld
17c60 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
17c70 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
17c80 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20   pSize, *pSize, 
17c90 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
17ca0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
17cb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
17cc0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
17cd0 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
17ce0 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
17cf0 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
17d00 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
17d10 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
17d20 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
17d30 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
17d40 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
17d50 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
17d60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
17d70 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
17d80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
17d90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
17da0 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
17db0 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
17dc0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
17dd0 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
17de0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
17df0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
17e00 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
17e10 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
17e20 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
17e30 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
17e40 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
17e50 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
17e60 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
17e70 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
17e80 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
17e90 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
17ea0 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
17eb0 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
17ec0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
17ed0 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
17ee0 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
17ef0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
17f00 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
17f10 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
17f20 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
17f30 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
17f40 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
17f50 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
17f60 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
17f70 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
17fa0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
17fb0 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
17fc0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
17fd0 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
17fe0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
17ff0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
18000 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
18010 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
18020 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
18030 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
18040 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
18050 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
18060 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
18070 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
18080 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
18090 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
180a0 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
180b0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
180c0 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
180d0 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
180e0 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
180f0 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
18100 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
18110 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
18120 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
18130 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65  tic int winGetRe
18140 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
18150 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
18160 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
18170 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
18180 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
18190 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
181a0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
181b0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
181c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
181d0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
181e0 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
181f0 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
18200 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
18210 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
18220 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20  Win32.    **    
18230 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45     API LockFileE
18240 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  x..    */.    re
18250 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  s = winceLockFil
18260 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
18270 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c  RED_FIRST, 0, 1,
18280 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72   0);.#else.    r
18290 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
182a0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
182b0 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
182c0 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
182d0 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
182e0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
182f0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e  ED_SIZE, 0);.#en
18300 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
18310 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
18320 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
18330 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
18340 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
18350 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
18360 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
18370 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
18380 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
18390 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
183a0 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
183b0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
183c0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
183d0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
183e0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
183f0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
18400 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
18410 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
18420 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
18430 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20  if.  if( res == 
18440 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
18450 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
18460 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
18470 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20    /* No need to 
18480 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f  log a failure to
18490 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f   lock */.  }.  O
184a0 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
184b0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
184c0 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
184d0 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
184e0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
184f0 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
18500 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
18510 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
18520 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
18530 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
18540 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
18550 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
18560 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
18570 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
18580 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
18590 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
185a0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
185b0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
185c0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
185d0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
185e0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
185f0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
18600 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
18610 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
18620 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
18630 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
18640 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
18650 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
18660 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
18670 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
18680 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
18690 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
186a0 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
186b0 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
186c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
186d0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
186e0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
186f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
18700 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
18710 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
18720 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
18730 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65  ReadLock", pFile
18740 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
18750 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
18760 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  NLOCK file=%p, r
18770 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69  esult=%d\n", pFi
18780 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
18790 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
187a0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
187b0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
187c0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
187d0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
187e0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
187f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
18800 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
18810 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
18820 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
18830 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
18840 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
18850 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
18860 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
18870 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
18880 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
18890 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
188a0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
188b0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
188c0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
188d0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
188e0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
188f0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
18900 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
18910 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
18920 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
18930 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
18940 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
18950 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
18960 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
18970 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
18980 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
18990 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
189a0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
189b0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
189c0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
189d0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
189e0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
189f0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
18a00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
18a10 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
18a20 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
18a30 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
18a40 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
18a50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18a60 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
18a70 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
18a80 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20  The winUnlock() 
18a90 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
18aa0 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
18ab0 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
18ac0 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
18ad0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
18ae0 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
18af0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
18b00 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
18b10 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
18b20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
18b30 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
18b40 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
18b50 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  l 0..*/.static i
18b60 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74  nt winLock(sqlit
18b70 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18b80 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
18b90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18ba0 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63  ;    /* Return c
18bb0 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  ode from subrout
18bc0 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ines */.  int re
18bd0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
18be0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20   /* Result of a 
18bf0 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c  Windows lock cal
18c00 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f  l */.  int newLo
18c10 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  cktype;       /*
18c20 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   Set pFile->lock
18c30 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c  type to this val
18c40 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  ue before exitin
18c50 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65  g */.  int gotPe
18c60 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a  ndingLock = 0;/*
18c70 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75   True if we acqu
18c80 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c  ired a PENDING l
18c90 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ock this time */
18ca0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
18cb0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
18cc0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
18cd0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
18ce0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
18cf0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
18d00 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
18d10 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
18d20 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
18d30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
18d40 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
18d50 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
18d60 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
18d70 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
18d80 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
18d90 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
18da0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
18db0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
18dc0 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
18dd0 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
18de0 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
18df0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
18e00 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
18e10 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
18e20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
18e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
18e40 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
18e50 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54  ktype ){.    OST
18e60 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44  RACE(("LOCK-HELD
18e70 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18e80 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18e90 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
18ea0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18eb0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
18ec0 6c 6f 77 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  low any kind of 
18ed0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20  write-lock on a 
18ee0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
18ef0 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  se.  */.  if( (p
18f00 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
18f10 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  & WINFILE_RDONLY
18f20 29 21 3d 30 20 26 26 20 6c 6f 63 6b 74 79 70 65  )!=0 && locktype
18f30 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
18f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18f50 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
18f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
18f70 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
18f80 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
18f90 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
18fa0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
18fb0 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
18fc0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
18fd0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
18fe0 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
18ff0 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
19000 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
19010 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
19020 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
19030 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
19040 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
19050 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
19060 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
19070 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
19080 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
19090 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
190a0 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
190b0 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
190c0 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
190d0 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
190e0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
190f0 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
19100 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
19110 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
19120 79 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  ype;.  if( pFile
19130 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
19140 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  OCK.   || (lockt
19150 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
19160 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
19170 63 6b 74 79 70 65 3c 3d 52 45 53 45 52 56 45 44  cktype<=RESERVED
19180 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
19190 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
191a0 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
191b0 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63  && (res = winLoc
191c0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
191d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
191e0 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
19220 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
19230 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
19240 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
19250 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
19260 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  is is needed to 
19270 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72  work.      ** ar
19280 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
19290 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67  used by indexing
192a0 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72   and/or anti-vir
192b0 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20  us software on. 
192c0 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20       ** Windows 
192d0 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a  systems..      *
192e0 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69  * If you are usi
192f0 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20  ng this code as 
19300 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65  a model for alte
19310 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64  rnative VFSes, d
19320 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  o not.      ** c
19330 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c  opy this retry l
19340 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68  ogic.  It is a h
19350 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  ack intended for
19360 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20   Windows only.. 
19370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61       */.      la
19380 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
19390 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
193a0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
193b0 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69  -PENDING-FAIL fi
193c0 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c  le=%p, count=%d,
193d0 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20   result=%d\n",. 
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
193f0 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73  ile->h, cnt, res
19400 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  ));.      if( la
19410 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49  stErrno==ERROR_I
19420 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b  NVALID_HANDLE ){
19430 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
19440 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
19450 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
19460 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
19470 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f  _LOCK;.        O
19480 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41  STRACE(("LOCK-FA
19490 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e  IL file=%p, coun
194a0 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  t=%d, rc=%s\n",.
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20   pFile->h, cnt, 
194d0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
194e0 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
194f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19500 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29  .      if( cnt )
19510 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
19520 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
19530 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
19540 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  k = res;.    if(
19550 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c   !res ){.      l
19560 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
19570 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
19580 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
19590 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f  uire a shared lo
195a0 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
195b0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
195c0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
195d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
195e0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
195f0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
19600 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
19610 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
19620 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
19630 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
19640 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
19650 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
19660 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
19670 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
19680 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
19690 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
196a0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
196b0 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
196c0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
196d0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
196e0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
196f0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
19700 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
19710 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
19720 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
19730 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
19740 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
19750 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
19760 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52  Locktype = RESER
19770 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  VED_LOCK;.    }e
19780 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
19790 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
197a0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
197b0 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
197c0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
197d0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
197e0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
197f0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
19800 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
19810 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
19820 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
19830 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
19840 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
19850 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
19860 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
19870 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
19880 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
19890 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
198a0 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
198b0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
198c0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
198d0 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20  pFile);.    res 
198e0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
198f0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
19900 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
19910 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
19920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19930 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
19940 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
19950 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
19960 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
19970 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
19980 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
19990 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
199a0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
199b0 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
199c0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
199d0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
199e0 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
199f0 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
19a00 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
19a10 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
19a20 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
19a30 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
19a40 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
19a50 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
19a60 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
19a70 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
19a80 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
19a90 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
19aa0 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
19ab0 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
19ac0 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
19ad0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
19ae0 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
19af0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
19b00 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
19b10 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
19b20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
19b30 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
19b40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19b50 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
19b60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
19b70 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  SY;.    OSTRACE(
19b80 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
19b90 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20  =%p, wanted=%d, 
19ba0 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  got=%d\n",.     
19bb0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
19bc0 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c  , locktype, newL
19bd0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20  ocktype));.  }. 
19be0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
19bf0 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
19c00 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
19c10 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
19c20 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
19c30 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
19c40 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
19c50 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
19c60 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
19c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19c80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19c90 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
19ca0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
19cb0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
19cc0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
19cd0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
19ce0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
19cf0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
19d00 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
19d10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
19d20 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
19d30 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
19d40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
19d50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19d60 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
19d70 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46   int res;.  winF
19d80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
19d90 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
19da0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
19db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19dc0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
19dd0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41  LOCK; );.  OSTRA
19de0 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
19df0 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
19e00 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ut=%p\n", pFile-
19e10 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  >h, pResOut));..
19e20 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
19e30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
19e40 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
19e50 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
19e60 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  es = 1;.    OSTR
19e70 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
19e80 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
19e90 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22  lt=%d (local)\n"
19ea0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29  , pFile->h, res)
19eb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19ec0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
19ed0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
19ee0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
19ef0 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59  LAGS,RESERVED_BY
19f00 54 45 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 69  TE,0,1,0);.    i
19f10 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
19f20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
19f30 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
19f40 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
19f50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73 20  ;.    }.    res 
19f60 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f 53 54 52  = !res;.    OSTR
19f70 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
19f80 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
19f90 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  lt=%d (remote)\n
19fa0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
19fb0 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ));.  }.  *pResO
19fc0 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52  ut = res;.  OSTR
19fd0 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
19fe0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
19ff0 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74  Out=%p, *pResOut
1a000 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%d, rc=SQLITE_O
1a010 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1a020 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
1a030 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a  ut, *pResOut));.
1a040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a050 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
1a060 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
1a070 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
1a080 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
1a090 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
1a0a0 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
1a0b0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
1a0c0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
1a0d0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
1a0e0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
1a0f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1a100 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
1a110 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
1a120 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1a130 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1a140 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
1a150 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
1a160 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
1a170 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
1a180 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
1a190 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
1a1a0 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
1a1b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1a1c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
1a1d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1a1e0 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
1a1f0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
1a200 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
1a210 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
1a220 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
1a230 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
1a240 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
1a250 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
1a260 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1a270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a280 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
1a290 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
1a2a0 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
1a2b0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
1a2c0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
1a2d0 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
1a2e0 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
1a2f0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
1a300 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
1a310 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
1a320 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
1a330 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  pe));.  type = p
1a340 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
1a350 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
1a360 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
1a370 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
1a380 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
1a390 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
1a3a0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
1a3b0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
1a3c0 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77  HARED_LOCK && !w
1a3d0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
1a3e0 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
1a3f0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
1a400 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
1a410 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
1a420 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
1a430 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
1a440 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
1a450 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1a460 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1a470 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73  UNLOCK, osGetLas
1a480 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46   "winUnlock", pF
1a4b0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1a4c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
1a4d0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
1a4e0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
1a4f0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
1a500 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1a510 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
1a520 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
1a530 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
1a540 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
1a550 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c    winUnlockReadL
1a560 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ock(pFile);.  }.
1a570 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44    if( type>=PEND
1a580 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
1a590 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
1a5a0 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
1a5b0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
1a5c0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
1a5d0 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63  cktype = (u8)loc
1a5e0 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
1a5f0 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
1a600 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25  p, lock=%d, rc=%
1a610 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1a620 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
1a630 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69  ->locktype, sqli
1a640 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1a650 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a660 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1a670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1a6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6d0 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a   No-op Locking *
1a6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a700 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76  *.**.** Of the v
1a710 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69  arious locking i
1a720 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
1a730 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69  vailable, this i
1a740 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20  s by far the.** 
1a750 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69  simplest:  locki
1a760 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  ng is ignored.  
1a770 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  No attempt is ma
1a780 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64  de to lock the d
1a790 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1a7a0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77  for reading or w
1a7b0 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
1a7c0 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
1a7d0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
1a7e0 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f  or use on read-o
1a7f0 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  nly databases.**
1a800 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20   (ex: databases 
1a810 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20  that are burned 
1a820 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72  into CD-ROM, for
1a830 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63   example.)  It c
1a840 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73  an.** also be us
1a850 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63  ed if the applic
1a860 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f  ation employs so
1a870 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68  me external mech
1a880 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76  anism to.** prev
1a890 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ent simultaneous
1a8a0 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73   access of the s
1a8b0 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20  ame database by 
1a8c0 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64  two or more.** d
1a8d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a8e0 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  ons.  But there 
1a8f0 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73  is a serious ris
1a900 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a  k of database.**
1a910 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74   corruption if t
1a920 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
1a930 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75   is used in situ
1a940 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c  ations where mul
1a950 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73  tiple.** databas
1a960 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
1a970 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
1a980 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1a990 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a  le at the same.*
1a9a0 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f  * time and one o
1a9b0 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20  r more of those 
1a9c0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
1a9d0 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61  writing..*/..sta
1a9e0 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f 63  tic int winNoloc
1a9f0 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
1aa00 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
1aa10 74 79 70 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  type){.  UNUSED_
1aa20 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20  PARAMETER(id);. 
1aa30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1aa40 52 28 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72  R(locktype);.  r
1aa50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aa60 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .}..static int w
1aa70 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  inNolockCheckRes
1aa80 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
1aa90 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1aaa0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55  *pResOut){.  UNU
1aab0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
1aac0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1aad0 4d 45 54 45 52 28 70 52 65 73 4f 75 74 29 3b 0a  METER(pResOut);.
1aae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aaf0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1ab00 74 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63  t winNolockUnloc
1ab10 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1ab20 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
1ab30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1ab40 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55  METER(id);.  UNU
1ab50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f  SED_PARAMETER(lo
1ab60 63 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72  cktype);.  retur
1ab70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ab80 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1ab90 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
1aba0 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
1abb0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
1abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1abd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1ac20 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
1ac30 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67  is initially neg
1ac40 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
1ac50 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
1ac60 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
1ac70 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
1ac80 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1ac90 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
1aca0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
1acb0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
1acc0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
1acd0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
1ace0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
1acf0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1ad00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1ad10 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
1ad20 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1ad30 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1ad40 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1ad50 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1ad60 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1ad70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1ad80 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1ad90 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1ada0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1adb0 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1adc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1add0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1ade0 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1adf0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1ae00 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70  nces to VFS help
1ae10 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20  er methods used 
1ae20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1ae30 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  les */.static in
1ae40 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  t winGetTempname
1ae50 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20  (sqlite3_vfs *, 
1ae60 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63  char **);.static
1ae70 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
1ae80 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61  nst void *);.sta
1ae90 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72  tic BOOL winIsDr
1aea0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
1aeb0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  n(const char *);
1aec0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20  ../*.** Control 
1aed0 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65  and query of the
1aee0 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1aef0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1af00 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   winFileControl(
1af10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1af20 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1af30 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65  pArg){.  winFile
1af40 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
1af50 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43  le*)id;.  OSTRAC
1af60 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1af70 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25  p, op=%d, pArg=%
1af80 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
1af90 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77  op, pArg));.  sw
1afa0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1afb0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1afc0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1afd0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1afe0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
1aff0 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  pe;.      OSTRAC
1b000 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b010 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1b020 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b030 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b050 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b060 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  NTL_LAST_ERRNO: 
1b070 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1b080 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65  Arg = (int)pFile
1b090 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1b0a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b0b0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b0c0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b0d0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b0e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b0f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b100 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
1b110 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
1b120 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1b130 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1b140 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b150 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b160 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1b170 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b190 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1b1a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b1b0 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
1b1c0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
1b1d0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20  Chunk>0 ){.     
1b1e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1b1f0 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20   oldSz;.        
1b200 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65  int rc = winFile
1b210 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29  Size(id, &oldSz)
1b220 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b240 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b250 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a  _int64 newSz = *
1b260 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
1b270 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20  pArg;.          
1b280 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20  if( newSz>oldSz 
1b290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
1b2a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b2b0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1b2c0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1b2d0 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29  ncate(id, newSz)
1b2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ;.            Si
1b2f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b300 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20  ign(0);.        
1b310 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b320 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b330 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b340 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
1b350 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
1b360 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
1b370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b380 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
1b390 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b3a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1b3b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b3d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b3e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b3f0 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
1b400 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
1b410 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
1b420 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1b430 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1b440 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b450 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b460 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b470 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b490 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b4a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
1b4b0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b4c0 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
1b4d0 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
1b4e0 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1b4f0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
1b500 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1b510 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b520 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1b530 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b550 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b560 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
1b570 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
1b580 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
1b590 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46  mprintf("%s", pF
1b5a0 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65  ile->pVfs->zName
1b5b0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1b5c0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1b5d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1b5e0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b5f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b600 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1b610 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b620 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
1b630 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
1b640 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
1b650 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
1b660 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
1b670 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
1b680 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b690 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
1b6a0 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20  nIoerrRetry;.   
1b6b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
1b6c0 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [1]>0 ){.       
1b6d0 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
1b6e0 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
1b6f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b700 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[1] = winIoerr
1b710 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
1b720 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
1b730 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b740 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1b750 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b760 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b770 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b780 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b790 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41  NTL_WIN32_GET_HA
1b7a0 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50  NDLE: {.      LP
1b7b0 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20  HANDLE phFile = 
1b7c0 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a  (LPHANDLE)pArg;.
1b7d0 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20        *phFile = 
1b7e0 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20  pFile->h;.      
1b7f0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1b800 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1b810 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
1b820 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
1b830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b840 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1b850 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65 20  E_TEST.    case 
1b860 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
1b870 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b  32_SET_HANDLE: {
1b880 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20  .      LPHANDLE 
1b890 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44  phFile = (LPHAND
1b8a0 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20 48  LE)pArg;.      H
1b8b0 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d  ANDLE hOldFile =
1b8c0 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20   pFile->h;.     
1b8d0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46   pFile->h = *phF
1b8e0 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46 69  ile;.      *phFi
1b8f0 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20  le = hOldFile;. 
1b900 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b910 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c  CNTL oldFile=%p,
1b920 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d   newFile=%p, rc=
1b930 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4f 6c               hOl
1b950 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  dFile, pFile->h)
1b960 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b980 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1b990 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1b9a0 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1b9b0 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1b9c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
1b9d0 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
1b9e0 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c  ame(pFile->pVfs,
1b9f0 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20   &zTFile);.     
1ba00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  OK ){.        *(
1ba20 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
1ba30 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
1ba40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1ba50 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1ba60 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
1ba70 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1ba80 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
1ba90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69  urn rc;.    }.#i
1baa0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1bab0 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
1bac0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
1bad0 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
1bae0 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
1baf0 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
1bb00 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
1bb10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
1bb20 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
1bb30 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1bb40 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
1bb50 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
1bb60 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1bb70 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
1bb80 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  .      /* The va
1bb90 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20  lue of newLimit 
1bba0 6d 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  may be eventuall
1bbb0 79 20 63 61 73 74 20 74 6f 20 28 53 49 5a 45 5f  y cast to (SIZE_
1bbc0 54 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20  T) and passed.  
1bbd0 20 20 20 20 2a 2a 20 74 6f 20 4d 61 70 56 69 65      ** to MapVie
1bbe0 77 4f 66 46 69 6c 65 28 29 2e 20 52 65 73 74 72  wOfFile(). Restr
1bbf0 69 63 74 20 69 74 73 20 76 61 6c 75 65 20 74 6f  ict its value to
1bc00 20 32 47 42 20 69 66 20 28 53 49 5a 45 5f 54 29   2GB if (SIZE_T)
1bc10 20 69 73 20 6e 6f 74 20 61 74 0a 20 20 20 20 20   is not at.     
1bc20 20 2a 2a 20 6c 65 61 73 74 20 61 20 36 34 2d 62   ** least a 64-b
1bc30 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20  it type. */.    
1bc40 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 30    if( newLimit>0
1bc50 20 26 26 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f   && sizeof(SIZE_
1bc60 54 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20 20  T)<8 ){.        
1bc70 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77 4c  newLimit = (newL
1bc80 69 6d 69 74 20 26 20 30 78 37 46 46 46 46 46 46  imit & 0x7FFFFFF
1bc90 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  F);.      }..   
1bca0 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d     *(i64*)pArg =
1bcb0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1bcc0 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Max;.      if( n
1bcd0 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65  ewLimit>=0 && ne
1bce0 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d  wLimit!=pFile->m
1bcf0 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46  mapSizeMax && pF
1bd00 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  ile->nFetchOut==
1bd10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
1bd20 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1bd30 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20  = newLimit;.    
1bd40 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
1bd50 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
1bd60 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66         winUnmapf
1bd70 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
1bd80 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61        rc = winMa
1bd90 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29  pfile(pFile, -1)
1bda0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bdb0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
1bdc0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1bdd0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
1bde0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
1bdf0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1be00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1be10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1be20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1be30 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1be40 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c  ITE_NOTFOUND\n",
1be50 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1be60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
1be70 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
1be80 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
1be90 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
1bea0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
1beb0 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
1bec0 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
1bed0 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
1bee0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
1bef0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
1bf00 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
1bf10 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
1bf20 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
1bf30 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
1bf40 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
1bf50 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
1bf60 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
1bf70 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
1bf80 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
1bf90 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
1bfa0 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
1bfb0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
1bfc0 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
1bfd0 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
1bfe0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1bff0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
1c000 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
1c010 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
1c020 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1c030 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64  *id){.  (void)id
1c040 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c050 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1c060 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
1c070 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20  Return a vector 
1c080 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63  of device charac
1c090 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74  teristics..*/.st
1c0a0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69  atic int winDevi
1c0b0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1c0c0 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1c0d0 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  id){.  winFile *
1c0e0 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  p = (winFile*)id
1c0f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c100 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
1c110 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a  BLE_WHEN_OPEN |.
1c120 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74           ((p->ct
1c130 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
1c140 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49  E_PSOW)?SQLITE_I
1c150 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1c160 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a  VERWRITE:0);.}..
1c170 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69  /*.** Windows wi
1c180 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20  ll only let you 
1c190 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77  create file view
1c1a0 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20   mappings.** on 
1c1b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
1c1c0 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e  granularity boun
1c1d0 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e  daries..** Durin
1c1e0 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  g sqlite3_os_ini
1c1f0 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53  t() we do a GetS
1c200 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74  ystemInfo().** t
1c210 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c  o get the granul
1c220 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73  arity size..*/.s
1c230 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46  tatic SYSTEM_INF
1c240 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23  O winSysInfo;..#
1c250 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c260 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65  IT_WAL../*.** He
1c270 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
1c280 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
1c290 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
1c2a0 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
1c2b0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
1c2c0 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
1c2d0 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f   the winLockInfo
1c2e0 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
1c2f0 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
1c300 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
1c310 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
1c320 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
1c330 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
1c340 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1c350 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
1c360 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
1c370 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20  bal mutex.** is 
1c380 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
1c390 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
1c3a0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
1c3b0 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
1c3c0 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
1c3d0 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77  . e.g..**.**   w
1c3e0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1c3f0 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  ).**     assert(
1c400 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1c410 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68  () );.**   winSh
1c420 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f  mLeaveMutex().*/
1c430 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1c440 6d 75 74 65 78 20 2a 77 69 6e 42 69 67 4c 6f 63  mutex *winBigLoc
1c450 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  k = 0;.static vo
1c460 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  id winShmEnterMu
1c470 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
1c480 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c490 28 77 69 6e 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a  (winBigLock);.}.
1c4a0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1c4b0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
1c4c0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1c4d0 74 65 78 5f 6c 65 61 76 65 28 77 69 6e 42 69 67  tex_leave(winBig
1c4e0 4c 6f 63 6b 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  Lock);.}.#ifndef
1c4f0 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
1c500 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  nt winShmMutexHe
1c510 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74  ld(void) {.  ret
1c520 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
1c530 78 5f 68 65 6c 64 28 77 69 6e 42 69 67 4c 6f 63  x_held(winBigLoc
1c540 6b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  k);.}.#endif../*
1c550 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
1c560 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73  to represent a s
1c570 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65  ingle file opene
1c580 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f  d and mmapped to
1c590 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72   provide.** shar
1c5a0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ed memory.  When
1c5b0 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1c5c0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1c5d0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d  the same.** log-
1c5e0 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68  summary, each th
1c5f0 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e  read has its own
1c600 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c   winFile object,
1c610 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a   but they all.**
1c620 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
1c630 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  le instance of t
1c640 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  his object.  In 
1c650 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
1c660 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  h.** log-summary
1c670 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20   is opened only 
1c680 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
1c690 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75  ..**.** winShmMu
1c6a0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1c6b0 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1c6c0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1c6d0 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1c6e0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1c6f0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1c700 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1c710 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1c720 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
1c730 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  t.**.** The foll
1c740 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1c750 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
1c760 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
1c770 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
1c780 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
1c790 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
1c7a0 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ither winShmNode
1c7b0 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
1c7c0 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64  eld or winShmNod
1c7d0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1c7e0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1c7f0 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
1c800 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1c810 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
1c820 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
1c830 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73  ructure..**.*/.s
1c840 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1c850 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   {.  sqlite3_mut
1c860 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
1c870 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
1c880 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
1c890 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
1c8a0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
1c8b0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1c8c0 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  le */.  winFile 
1c8d0 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  hFile;          
1c8e0 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
1c8f0 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a  e from winOpen *
1c900 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  /..  int szRegio
1c910 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1c920 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
1c930 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1c940 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f   */.  int nRegio
1c950 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1c960 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
1c970 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
1c980 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20  u8 isReadonly;  
1c990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c9a0 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20  ue if read-only 
1c9b0 2a 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63 6b  */.  u8 isUnlock
1c9c0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1c9d0 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44 4d  /* True if no DM
1c9e0 53 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 0a  S lock held */..
1c9f0 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
1ca00 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
1ca10 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
1ca20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
1ca30 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
1ca40 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
1ca50 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
1ca60 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
1ca70 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
1ca80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
1ca90 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
1caa0 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
1cab0 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
1cac0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1cad0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1cae0 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
1caf0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1cb00 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
1cb10 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1cb20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
1cb30 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1cb40 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
1cb50 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
1cb60 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1cb70 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
1cb80 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1cb90 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  s */.#if defined
1cba0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
1cbb0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1cbc0 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a  _HAVE_OS_TRACE).
1cbd0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cbf0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77  Next available w
1cc00 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  inShm.id value *
1cc10 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1cc20 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61  ** A global arra
1cc30 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  y of all winShmN
1cc40 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a  ode objects..**.
1cc50 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74  ** The winShmMut
1cc60 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
1cc70 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64   true while read
1cc80 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1cc90 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  his list..*/.sta
1cca0 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  tic winShmNode *
1ccb0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
1ccc0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63   0;../*.** Struc
1ccd0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
1cce0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
1ccf0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
1cd00 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
1cd10 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
1cd20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1cd30 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1cd40 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
1cd50 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
1cd60 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
1cd70 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
1cd80 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
1cd90 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69  ter:.**.**    wi
1cda0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a  nShm.pShmNode.**
1cdb0 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a      winShm.id.**
1cdc0 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
1cdd0 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
1cde0 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d  ite.  The winShm
1cdf0 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  .pShmNode->mutex
1ce00 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
1ce10 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
1ce20 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
1ce30 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
1ce40 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e  t winShm {.  win
1ce50 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1ce60 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75  e;      /* The u
1ce70 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d  nderlying winShm
1ce80 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
1ce90 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20   winShm *pNext; 
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ceb0 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20  ext winShm with 
1cec0 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e  the same winShmN
1ced0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
1cee0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
1cef0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
1cf00 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68  olding the winSh
1cf10 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
1cf20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1cf40 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
1cf50 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
1cf60 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
1cf70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1cf80 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
1cf90 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 20  cks held */.#if 
1cfa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1cfb0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1cfc0 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f  (SQLITE_HAVE_OS_
1cfd0 54 52 41 43 45 29 0a 20 20 75 38 20 69 64 3b 20  TRACE).  u8 id; 
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
1d000 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
1d010 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
1d020 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1d030 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
1d040 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
1d050 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
1d060 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
1d070 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1d080 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
1d090 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
1d0a0 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
1d0b0 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
1d0c0 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
1d0d0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
1d0e0 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
1d0f0 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
1d100 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
1d110 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
1d120 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
1d130 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f 55  #define WINSHM_U
1d140 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
1d150 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a  WINSHM_RDLCK  2.
1d160 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f 57  #define WINSHM_W
1d170 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
1d180 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
1d190 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
1d1a0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
1d1b0 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
1d1c0 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
1d1d0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
1d1e0 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
1d1f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 4e  ,         /* WIN
1d200 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 53 48  SHM_UNLCK, WINSH
1d210 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 57 49 4e 53  M_RDLCK, or WINS
1d220 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
1d230 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1d240 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
1d250 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
1d260 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
1d270 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d290 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1d2a0 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
1d2b0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
1d2c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d2d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1d2e0 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
1d2f0 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
1d300 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
1d310 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1d320 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
1d330 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
1d340 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1d350 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 73 71 6c 69  >nRef==0 || sqli
1d360 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d370 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  File->mutex) );.
1d380 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1d390 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
1d3a0 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ock=%d, offset=%
1d3b0 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20  d, size=%d\n",. 
1d3c0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1d3d0 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79  >hFile.h, lockTy
1d3e0 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29  pe, ofst, nByte)
1d3f0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
1d400 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73  /Acquire the sys
1d410 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
1d420 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  /.  if( lockType
1d430 3d 3d 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 29  ==WINSHM_UNLCK )
1d440 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e  {.    rc = winUn
1d450 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
1d460 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20  >hFile.h, ofst, 
1d470 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
1d480 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
1d490 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
1d4a0 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
1d4b0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  */.    DWORD dwF
1d4c0 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
1d4d0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
1d4e0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  ;.    if( lockTy
1d4f0 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 57 52 4c  pe == WINSHM_WRL
1d500 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20  CK ) dwFlags |= 
1d510 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
1d520 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  VE_LOCK;.    rc 
1d530 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
1d540 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64  File->hFile.h, d
1d550 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c  wFlags, ofst, 0,
1d560 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a   nByte, 0);.  }.
1d570 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
1d580 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d590 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
1d5a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1d5b0 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
1d5c0 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
1d5d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d5e0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
1d5f0 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
1d600 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d   func=%s, errno=
1d610 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  %lu, rc=%s\n",. 
1d620 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1d630 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54  >hFile.h, (lockT
1d640 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 55 4e  ype == WINSHM_UN
1d650 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63  LCK) ? "winUnloc
1d660 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20  kFile" :.       
1d670 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65      "winLockFile
1d680 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ", pFile->lastEr
1d690 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  rno, sqlite3ErrN
1d6a0 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65  ame(rc)));..  re
1d6b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1d6c0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1d6d0 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
1d6e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
1d6f0 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
1d700 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
1d710 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1d720 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
1d730 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
1d740 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
1d750 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
1d760 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
1d770 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
1d780 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1d790 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
1d7a0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
1d7b0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
1d7c0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1d7d0 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
1d7e0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
1d7f0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
1d800 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1d810 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
1d820 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
1d830 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
1d840 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
1d850 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
1d860 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
1d870 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61  nShmNode *p;.  a
1d880 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
1d890 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53  exHeld() );.  OS
1d8a0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1d8b0 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74  E pid=%lu, delet
1d8c0 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20  eFlag=%d\n",.   
1d8d0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1d8e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1d8f0 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20   deleteFlag));. 
1d900 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
1d910 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
1d920 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
1d930 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
1d940 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1d950 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
1d960 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33  mutex ){ sqlite3
1d970 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d  _mutex_free(p->m
1d980 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66  utex); }.      f
1d990 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
1d9a0 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
1d9b0 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f      BOOL bRc = o
1d9c0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
1d9d0 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
1d9e0 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
1d9f0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1da00 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c  E-UNMAP pid=%lu,
1da10 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
1da20 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1da30 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1da40 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1da50 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
1da60 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1da70 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41      UNUSED_VARIA
1da80 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a  BLE_VALUE(bRc);.
1da90 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
1daa0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
1dab0 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
1dac0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1dad0 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f  (("SHM-PURGE-CLO
1dae0 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  SE pid=%lu, regi
1daf0 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  on=%d, rc=%s\n",
1db00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db10 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1db20 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52  ocessId(), i, bR
1db30 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
1db40 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  ed"));.        U
1db50 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56  NUSED_VARIABLE_V
1db60 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20  ALUE(bRc);.     
1db70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
1db80 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26  hFile.h!=NULL &&
1db90 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56   p->hFile.h!=INV
1dba0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1dbb0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
1dbc0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1dbd0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
1dbe0 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
1dbf0 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
1dc00 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
1dc10 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1dc20 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
1dc30 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
1dc40 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
1dc50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1dc60 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1dc70 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
1dc80 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
1dc90 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
1dca0 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
1dcb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1dcc0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1dcd0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
1dce0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1dcf0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1dd00 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
1dd10 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1dd20 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
1dd30 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
1dd40 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1dd50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dd60 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
1dd70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1dd80 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f 63 6b 20  ** The DMS lock 
1dd90 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1dda0 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d 20 66 69   taken on shm fi
1ddb0 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20 41 74 74  le pShmNode. Att
1ddc0 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61 6b 65 20  empt to.** take 
1ddd0 69 74 20 6e 6f 77 2e 20 52 65 74 75 72 6e 20 53  it now. Return S
1dde0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1ddf0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1de00 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
1de10 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
1de20 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d 53 20 63  .** If the DMS c
1de30 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  annot be locked 
1de40 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20  because this is 
1de50 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31  a readonly_shm=1
1de60 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  .** connection a
1de70 6e 64 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  nd no other proc
1de80 65 73 73 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ess already hold
1de90 73 20 61 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  s a lock, return
1dea0 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  .** SQLITE_READO
1deb0 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 61 6e 64  NLY_CANTINIT and
1dec0 20 73 65 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   set pShmNode->i
1ded0 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a  sUnlocked=1..*/.
1dee0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
1def0 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77  ckSharedMemory(w
1df00 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1df10 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
1df20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1df30 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1df40 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
1df50 4d 5f 44 4d 53 2c 20 31 29 3b 0a 0a 20 20 69 66  M_DMS, 1);..  if
1df60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df70 29 7b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ){.    if( pShmN
1df80 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
1df90 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  ){.      pShmNod
1dfa0 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20  e->isUnlocked = 
1dfb0 31 3b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53  1;.      winShmS
1dfc0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1dfd0 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  de, WINSHM_UNLCK
1dfe0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1dff0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e000 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
1e010 43 41 4e 54 49 4e 49 54 3b 0a 20 20 20 20 7d 65  CANTINIT;.    }e
1e020 6c 73 65 20 69 66 28 20 77 69 6e 54 72 75 6e 63  lse if( winTrunc
1e030 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
1e040 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  e*)&pShmNode->hF
1e050 69 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ile, 0) ){.     
1e060 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1e070 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1e080 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
1e090 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
1e0a0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1e0b0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e0c0 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c  _SHMOPEN, osGetL
1e0d0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 53 68 61       "winLockSha
1e100 72 65 64 4d 65 6d 6f 72 79 22 2c 20 70 53 68 6d  redMemory", pShm
1e110 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
1e120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1e130 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e140 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 53 79   ){.    winShmSy
1e150 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1e160 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c  e, WINSHM_UNLCK,
1e170 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1e180 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e190 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1e1a0 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48  (pShmNode, WINSH
1e1b0 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
1e1c0 5f 44 4d 53 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  _DMS, 1);.}../*.
1e1d0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
1e1e0 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
1e1f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
1e200 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
1e210 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
1e220 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1e230 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1e240 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1e250 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1e260 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1e270 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1e280 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1e290 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1e2a0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1e2b0 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1e2c0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1e2d0 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1e2e0 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1e2f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1e300 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
1e310 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
1e320 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
1e330 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
1e340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1e350 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1e360 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 77 69 6e 53  opened */.  winS
1e370 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1e380 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1e390 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1e3a0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1e3b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e3c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1e3d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1e3e0 63 6f 64 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  code */.  winShm
1e3f0 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e410 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
1e420 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1e430 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
1e460 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
1e470 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1e480 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
1e490 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
1e4a0 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
1e4b0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1e4c0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
1e4d0 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
1e4e0 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
1e4f0 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
1e500 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
1e510 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
1e520 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
1e530 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
1e540 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
1e550 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
1e560 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1e570 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
1e580 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  KPT;.  nName = s
1e590 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
1e5a0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1e5b0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61  pNew = sqlite3Ma
1e5c0 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
1e5d0 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e  (*pShmNode) + nN
1e5e0 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66  ame + 17 );.  if
1e5f0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1e600 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1e610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1e620 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1e630 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  BKPT;.  }.  pNew
1e640 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
1e650 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
1e660 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1e670 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77  f(nName+15, pNew
1e680 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ->zFilename, "%s
1e690 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
1e6a0 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ath);.  sqlite3F
1e6b0 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
1e6c0 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a  ->zPath, pNew->z
1e6d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  Filename);..  /*
1e6e0 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
1e6f0 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
1e700 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ting winShmNode 
1e710 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1e720 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  ** If no mat
1e730 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  ching winShmNode
1e740 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
1e750 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  s, create a new 
1e760 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53  one..  */.  winS
1e770 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
1e780 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d    for(pShmNode =
1e790 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1e7a0 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e   pShmNode; pShmN
1e7b0 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e  ode=pShmNode->pN
1e7c0 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44  ext){.    /* TBD
1e7d0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70   need to come up
1e7e0 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74   with better mat
1e7f0 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70  ch here.  Perhap
1e800 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c  s.    ** use FIL
1e810 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e  E_ID_BOTH_DIR_IN
1e820 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20  FO Structure..  
1e830 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1e840 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d  ite3StrICmp(pShm
1e850 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1e860 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1e870 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1e880 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
1e890 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1e8a0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65  free(pNew);.  }e
1e8b0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 6e 46  lse{.    int inF
1e8c0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1e8d0 45 4e 5f 57 41 4c 3b 0a 20 20 20 20 69 6e 74 20  EN_WAL;.    int 
1e8e0 6f 75 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20  outFlags = 0;.. 
1e8f0 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
1e900 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
1e910 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
1e920 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
1e930 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
1e940 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
1e950 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
1e960 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
1e970 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
1e980 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
1e990 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  ode;..    if( sq
1e9a0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e9b0 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
1e9c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e9d0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1e9e0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1e9f0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1ea00 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
1ea10 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1ea20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ea30 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1ea40 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1ea50 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1ea60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ea70 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
1ea80 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70  e3_uri_boolean(p
1ea90 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65  DbFd->zPath, "re
1eaa0 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20  adonly_shm", 0) 
1eab0 29 7b 0a 20 20 20 20 20 20 69 6e 46 6c 61 67 73  ){.      inFlags
1eac0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
1ead0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1eae0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
1eaf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb00 20 69 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49   inFlags |= SQLI
1eb10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1eb20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1eb30 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
1eb40 70 56 66 73 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  pVfs, pShmNode->
1eb50 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1eb70 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
1eb80 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 0a 20 20 20  Node->hFile,.   
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1eba0 46 6c 61 67 73 2c 20 26 6f 75 74 46 6c 61 67 73  Flags, &outFlags
1ebb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ebc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ebd0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1ebe0 6f 72 28 72 63 2c 20 6f 73 47 65 74 4c 61 73 74  or(rc, osGetLast
1ebf0 45 72 72 6f 72 28 29 2c 20 22 77 69 6e 4f 70 65  Error(), "winOpe
1ec00 6e 53 68 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  nShm",.         
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
1ec20 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1ec30 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  e);.      goto s
1ec40 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1ec50 20 7d 0a 20 20 20 20 69 66 28 20 6f 75 74 46 6c   }.    if( outFl
1ec60 61 67 73 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ags==SQLITE_OPEN
1ec70 5f 52 45 41 44 4f 4e 4c 59 20 29 20 70 53 68 6d  _READONLY ) pShm
1ec80 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
1ec90 20 3d 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = 1;..    rc = 
1eca0 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  winLockSharedMem
1ecb0 6f 72 79 28 70 53 68 6d 4e 6f 64 65 29 3b 0a 20  ory(pShmNode);. 
1ecc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ecd0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
1ece0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
1ecf0 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68 6d 5f  INIT ) goto shm_
1ed00 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
1ed10 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
1ed20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
1ed30 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ild of the winSh
1ed40 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
1ed50 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
1ed60 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
1ed70 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1ed80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
1ed90 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20  AVE_OS_TRACE).  
1eda0 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
1edb0 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
1edc0 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
1edd0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
1ede0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77  d->pShm = p;.  w
1edf0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1ee00 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
1ee10 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
1ee20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
1ee30 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
1ee40 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
1ee50 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
1ee60 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  e winShmEnterMut
1ee70 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
1ee80 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
1ee90 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
1eea0 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a  ruct winShm) obj
1eeb0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
1eec0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
1eed0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
1eee0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
1eef0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
1ef00 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
1ef10 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
1ef20 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
1ef30 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
1ef40 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
1ef50 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
1ef60 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
1ef70 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  tex.  ** mutex..
1ef80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1ef90 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1efa0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
1efb0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
1efc0 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
1efd0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
1efe0 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
1eff0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1f000 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
1f010 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
1f020 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
1f030 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
1f040 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53  n_err:.  winShmS
1f050 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1f060 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  de, WINSHM_UNLCK
1f070 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1f080 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65  );.  winShmPurge
1f090 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29  (pDbFd->pVfs, 0)
1f0a0 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;      /* This c
1f0b0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1f0c0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1f0d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1f0e0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
1f0f0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e  ree(pNew);.  win
1f100 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1f110 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f120 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1f130 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
1f140 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
1f150 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
1f160 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  ng.** storage if
1f170 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
1f180 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
1f190 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
1f1a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1f1b0 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1f1c0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1f1d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1f1e0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
1f1f0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
1f200 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
1f210 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
1f220 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1f230 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
1f240 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1f250 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1f260 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
1f270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1f290 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
1f2a0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1f2b0 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
1f2c0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
1f2d0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
1f2e0 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
1f2f0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1f300 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
1f310 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
1f320 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
1f330 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
1f340 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
1f350 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1f360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
1f370 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1f380 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
1f390 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
1f3a0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
1f3b0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
1f3c0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
1f3d0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
1f3e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1f3f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1f400 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
1f410 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
1f420 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
1f430 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
1f440 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1f450 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
1f460 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
1f470 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f480 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
1f490 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1f4a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1f4b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
1f4c0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
1f4d0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
1f4e0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
1f4f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
1f500 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
1f510 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
1f520 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1f530 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
1f540 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
1f550 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
1f560 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
1f570 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1f580 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
1f590 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
1f5a0 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
1f5b0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1f5c0 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
1f5d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f5e0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1f5f0 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1f600 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1f610 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
1f620 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
1f630 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1f640 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1f650 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
1f660 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1f670 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1f680 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1f690 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1f6a0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
1f6b0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1f6c0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f6e0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
1f6f0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1f700 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
1f710 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1f720 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1f730 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
1f740 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
1f750 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1f760 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
1f770 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
1f780 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1f790 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1f7a0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1f7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f7c0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
1f7d0 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
1f7e0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
1f7f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1f810 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1f820 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
1f830 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1f840 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1f850 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1f860 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f880 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1f890 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1f8c0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
1f8d0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
1f8e0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
1f8f0 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
1f900 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
1f910 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1f920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
1f930 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1f940 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1f950 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1f960 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1f970 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1f980 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1f990 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
1f9a0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1f9b0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1f9c0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1f9d0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1f9e0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1f9f0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1fa00 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
1fa10 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
1fa20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1fa30 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
1fa40 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
1fa50 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
1fa60 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
1fa70 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
1fa80 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
1fa90 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
1faa0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1fab0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
1fac0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1fad0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
1fae0 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
1faf0 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
1fb00 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
1fb10 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
1fb20 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
1fb30 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
1fb40 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
1fb50 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1fb60 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1fb70 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1fb80 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
1fb90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
1fba0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
1fbb0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
1fbc0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
1fbd0 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
1fbe0 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
1fbf0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1fc00 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
1fc10 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1fc20 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1fc30 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
1fc40 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
1fc50 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1fc60 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1fc70 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73  INSHM_UNLCK, ofs
1fc80 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1fc90 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
1fca0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fcb0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
1fcc0 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
1fcd0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1fce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fcf0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
1fd00 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1fd10 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1fd20 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1fd30 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1fd40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1fd50 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
1fd60 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
1fd70 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
1fd80 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
1fd90 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
1fda0 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
1fdb0 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
1fdc0 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
1fdd0 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
1fde0 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
1fdf0 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
1fe00 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
1fe10 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
1fe20 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
1fe30 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
1fe40 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
1fe50 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
1fe60 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1fe70 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1fe80 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1fe90 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
1fea0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
1feb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1fec0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1fed0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
1fef0 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
1ff00 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
1ff10 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
1ff20 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
1ff30 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
1ff40 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1ff50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ff60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1ff70 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
1ff80 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1ff90 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1ffa0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1ffb0 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 2c 20  , WINSHM_RDLCK, 
1ffc0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1ffd0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1ffe0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1fff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20000 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20010 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
20020 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
20030 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
20050 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
20060 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
20070 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
20080 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
20090 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
200a0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
200b0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
200c0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
200d0 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
200e0 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
200f0 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
20100 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
20110 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
20120 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
20130 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
20140 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
20150 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
20160 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
20170 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20180 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
20190 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
201a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
201b0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
201c0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
201d0 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
201e0 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
201f0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
20200 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
20210 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
20220 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
20230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
20250 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
20260 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
20270 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
20280 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
20290 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
202a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
202b0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
202c0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
202d0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
202e0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
202f0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
20300 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
20310 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
20320 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
20330 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
20340 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
20350 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
20360 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
20370 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
20380 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
20390 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
203a0 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
203b0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
203c0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
203d0 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
203e0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
203f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
20400 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
20410 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
20420 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
20430 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  ed memory..**.**
20440 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
20450 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
20460 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
20470 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
20480 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
20490 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
204a0 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
204b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
204c0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a   winShmBarrier(.
204d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
204e0 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  fd          /* D
204f0 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
20500 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
20510 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
20520 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
20530 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42    sqlite3MemoryB
20540 61 72 72 69 65 72 28 29 3b 20 20 20 2f 2a 20 63  arrier();   /* c
20550 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20  ompiler-defined 
20560 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a  memory barrier *
20570 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
20580 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 2f 2a  utex();       /*
20590 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72   Also mutex, for
205a0 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20   redundancy */. 
205b0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
205c0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  x();.}../*.** Th
205d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
205e0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
205f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
20600 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
20610 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  he.** shared-mem
20620 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
20630 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
20640 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
20650 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0a  -memory regions.
20660 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ** are numbered 
20670 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65  starting from ze
20680 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d  ro. Each shared-
20690 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73  memory region is
206a0 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79 74   szRegion.** byt
206b0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
206c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
206d0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
206e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
206f0 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
20700 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
20710 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
20720 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65  isWrite paramete
20730 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
20740 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
20750 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
20760 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
20770 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
20780 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
20790 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
207a0 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
207b0 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
207c0 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
207d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
207e0 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 69  eturned. If.** i
207f0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
20800 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
20810 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
20820 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
20830 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61 6c  t yet.** been al
20840 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
20850 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
20860 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
20870 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
20880 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
20890 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
208a0 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
208b0 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
208c0 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
208d0 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
208e0 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
208f0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
20900 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61  s.** address spa
20910 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
20920 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
20930 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
20940 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a 20  o the mapped.** 
20950 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
20960 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
20970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20980 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
20990 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
209a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
209b0 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
209c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
209d0 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
209f0 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
20a00 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
20a10 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
20a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20a30 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
20a40 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20    int isWrite,  
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
20a70 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
20a80 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
20a90 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
20aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
20ab0 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
20ac0 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
20ad0 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
20ae0 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d  le*)fd;.  winShm
20af0 20 2a 70 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e   *pShm = pDbFd->
20b00 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
20b10 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
20b20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
20b30 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a  PAGE_READWRITE;.
20b40 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
20b50 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
20b60 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
20b70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20b80 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 53  E_OK;..  if( !pS
20b90 68 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  hm ){.    rc = w
20ba0 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
20bb0 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
20bc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20bd0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20be0 20 20 70 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e    pShm = pDbFd->
20bf0 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d  pShm;.  }.  pShm
20c00 4e 6f 64 65 20 3d 20 70 53 68 6d 2d 3e 70 53 68  Node = pShm->pSh
20c10 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65  mNode;..  sqlite
20c20 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
20c30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
20c40 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
20c50 69 73 55 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  isUnlocked ){.  
20c60 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 53 68    rc = winLockSh
20c70 61 72 65 64 4d 65 6d 6f 72 79 28 70 53 68 6d 4e  aredMemory(pShmN
20c80 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
20c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20ca0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
20cb0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
20cc0 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20  Unlocked = 0;.  
20cd0 7d 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  }.  assert( szRe
20ce0 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
20cf0 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
20d00 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
20d10 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
20d20 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
20d30 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
20d40 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
20d50 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
20d60 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
20d70 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
20d80 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
20d90 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
20da0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
20db0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
20dc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
20dd0 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
20de0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
20df0 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
20e00 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
20e10 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
20e20 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
20e30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
20e40 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
20e50 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
20e60 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
20e70 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
20e80 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
20e90 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
20ea0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
20eb0 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
20ec0 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
20ed0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
20ee0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
20ef0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
20f00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
20f10 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
20f20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
20f30 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
20f40 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
20f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20f60 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
20f70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
20f80 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
20f90 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31       "winShmMap1
20fc0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
20fd0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
20fe0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
20ff0 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74  .    if( sz<nByt
21000 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
21010 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
21020 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
21030 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57  ot exist. If isW
21040 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20  rite is set to. 
21050 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78       ** zero, ex
21060 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
21070 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
21080 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
21090 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
210a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  **.      ** Alte
210b0 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73  rnatively, if is
210c0 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
210d0 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  o, use ftruncate
210e0 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
210f0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
21100 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
21110 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
21120 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65      if( !isWrite
21130 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
21140 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  out;.      rc = 
21150 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
21160 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
21170 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42  mNode->hFile, nB
21180 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
21190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
211a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
211b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
211c0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
211d0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
211e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
211f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
21200 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
21210 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
21220 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
21230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21240 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
21250 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
21260 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
21270 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
21280 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
21290 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
212a0 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
212b0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
212c0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
212d0 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
212e0 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
212f0 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
21300 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
21310 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21320 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
21330 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
21340 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
21350 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
21360 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  ->aRegion = apNe
21370 77 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  w;..    if( pShm
21380 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
21390 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63   ){.      protec
213a0 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c  t = PAGE_READONL
213b0 59 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 3d  Y;.      flags =
213c0 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
213d0 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
213e0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
213f0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
21400 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
21410 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
21420 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
21430 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
21440 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
21450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21460 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
21470 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53 51  egion */..#if SQ
21480 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
21490 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
214a0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
214b0 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  omApp(pShmNode->
214c0 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
214d0 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74     NULL, protect
214e0 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
214f0 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
21500 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
21510 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20  2_HAS_WIDE).    
21520 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
21530 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53  eFileMappingW(pS
21540 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
21550 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
21560 20 70 72 6f 74 65 63 74 2c 20 30 2c 20 6e 42 79   protect, 0, nBy
21570 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
21580 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
21590 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
215a0 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45  _ANSI) && SQLITE
215b0 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c  _WIN32_CREATEFIL
215c0 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 20 20  EMAPPINGA.      
215d0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
215e0 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d  ileMappingA(pShm
215f0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
21600 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 70           NULL, p
21610 72 6f 74 65 63 74 2c 20 30 2c 20 6e 42 79 74 65  rotect, 0, nByte
21620 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
21630 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
21640 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
21650 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
21660 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
21670 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
21680 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
21690 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
216a0 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
216b0 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
216d0 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
216e0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
216f0 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
21700 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
21710 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
21720 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
21730 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
21740 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
21750 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
21760 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
21770 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
21780 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
21790 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
217a0 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
217b0 4d 61 70 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  Map, flags,.    
217c0 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74 20          iOffset 
217d0 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
217e0 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
217f0 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
21800 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
21810 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
21820 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 66 6c  wOfFile(hMap, fl
21830 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
21840 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f   0, iOffset - iO
21850 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
21860 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
21870 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
21880 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53  endif.        OS
21890 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
218a0 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  MAP pid=%lu, reg
218b0 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ion=%d, offset=%
218c0 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25  d, size=%d, rc=%
218d0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
218e0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
218f0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
21900 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
21910 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20  n, iOffset,.    
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52               szR
21930 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f  egion, pMap ? "o
21940 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
21950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21960 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20  f( !pMap ){.    
21970 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61      pShmNode->la
21980 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
21990 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
219a0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
219b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
219c0 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f  R_SHMMAP, pShmNo
219d0 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  de->lastErrno,. 
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
21a00 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap3", pDbFd->zPa
21a10 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
21a20 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48   hMap ) osCloseH
21a30 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
21a40 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
21a50 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
21a60 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21a70 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
21a80 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
21a90 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
21aa0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
21ab0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
21ac0 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
21ad0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21ae0 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
21af0 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
21b00 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
21b10 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
21b20 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
21b30 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
21b40 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
21b50 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
21b60 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
21b70 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
21b80 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
21b90 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
21ba0 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
21bb0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
21bc0 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
21bd0 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
21be0 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
21bf0 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
21c00 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
21c10 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26  de->isReadonly &
21c20 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
21c30 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45  ) rc = SQLITE_RE
21c40 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65  ADONLY;.  sqlite
21c50 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
21c60 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
21c70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21c80 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
21c90 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  inShmMap     0.#
21ca0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f   define winShmLo
21cb0 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
21cc0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30   winShmBarrier 0
21cd0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
21ce0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
21cf0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
21d00 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
21d10 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20  /*.** Cleans up 
21d20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f  the mapped regio
21d30 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  n of the specifi
21d40 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e  ed file, if any.
21d50 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
21d60 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
21d70 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d  tatic int winUnm
21d80 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
21d90 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74  pFile){.  assert
21da0 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
21db0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
21dc0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
21dd0 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
21de0 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
21df0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d  ".           "mm
21e00 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61  apSize=%lld, mma
21e10 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64  pSizeActual=%lld
21e20 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c  , mmapSizeMax=%l
21e30 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
21e40 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
21e50 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
21e60 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70  , pFile->hMap, p
21e70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
21e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
21e90 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46  le->mmapSize, pF
21ea0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
21eb0 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ual, pFile->mmap
21ec0 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28  SizeMax));.  if(
21ed0 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
21ee0 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  on ){.    if( !o
21ef0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
21f00 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
21f10 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  on) ){.      pFi
21f20 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
21f30 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21f40 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21f50 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
21f60 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
21f70 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
21f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f90 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  "rc=SQLITE_IOERR
21fa0 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43  _MMAP\n", osGetC
21fb0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
21fc0 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20  ), pFile,.      
21fd0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
21fe0 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20  pMapRegion));.  
21ff0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22000 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
22010 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
22020 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69       "winUnmapfi
22050 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  le1", pFile->zPa
22060 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
22070 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
22080 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
22090 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
220a0 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
220b0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
220c0 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
220d0 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map!=NULL ){.   
220e0 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e   if( !osCloseHan
220f0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29  dle(pFile->hMap)
22100 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
22110 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
22120 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
22130 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
22140 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
22150 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
22160 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  p=%p, rc=SQLITE_
22170 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20  IOERR_MMAP\n",. 
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
22190 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
221a0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
221b0 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20  ile->hMap));.   
221c0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
221d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
221e0 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
221f0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
22220 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
22230 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
22240 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
22250 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
22260 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
22270 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
22280 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
22290 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
222a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
222b0 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20  d(), pFile));.  
222c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
222d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
222e0 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
222f0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
22300 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
22310 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
22320 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
22330 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
22340 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
22350 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
22360 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a   new). Or, if.**
22370 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
22380 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
22390 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
223a0 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
223b0 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  ll.** outstandin
223c0 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
223d0 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
223e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
223f0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
22400 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
22410 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
22420 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
22430 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
22440 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67  f.** the mapping
22450 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
22460 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
22470 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
22480 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72  o, then the.** r
22490 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
224a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
224b0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
224c0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
224d0 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
224e0 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
224f0 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
22500 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
22510 75 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  ue configured.**
22520 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
22530 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77  NTL_MMAP_SIZE, w
22540 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
22550 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
22560 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22570 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
22580 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
22590 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
225a0 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
225b0 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
225c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
225d0 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
225e0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
225f0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
22600 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69  tic int winMapfi
22610 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c  le(winFile *pFd,
22620 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
22630 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Byte){.  sqlite3
22640 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42  _int64 nMap = nB
22650 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  yte;.  int rc;..
22660 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d    assert( nMap>=
22670 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68  0 || pFd->nFetch
22680 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52  Out==0 );.  OSTR
22690 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
226a0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
226b0 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a  , size=%lld\n",.
226c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
226d0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
226e0 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29  (), pFd, nByte))
226f0 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  ;..  if( pFd->nF
22700 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
22710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
22720 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
22730 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
22740 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
22750 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a  e*)pFd, &nMap);.
22760 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22770 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
22780 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
22790 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
227a0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c  ITE_IOERR_FSTAT\
227b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
227c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
227d0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
227e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
227f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
22800 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  AT;.    }.  }.  
22810 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
22820 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
22830 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
22840 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20  pSizeMax;.  }.  
22850 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65  nMap &= ~(sqlite
22860 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49  3_int64)(winSysI
22870 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d  nfo.dwPageSize -
22880 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70   1);..  if( nMap
22890 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70  ==0 && pFd->mmap
228a0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69  Size>0 ){.    wi
228b0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
228c0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21  .  }.  if( nMap!
228d0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
228e0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
228f0 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20   = 0;.    DWORD 
22900 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
22910 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f  EADONLY;.    DWO
22920 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f  RD flags = FILE_
22930 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77  MAP_READ;..    w
22940 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
22950 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22960 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
22970 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72     if( (pFd->ctr
22980 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
22990 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  _RDONLY)==0 ){. 
229a0 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50       protect = P
229b0 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  AGE_READWRITE;. 
229c0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49       flags |= FI
229d0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20  LE_MAP_WRITE;.  
229e0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
229f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
22a00 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
22a10 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
22a20 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  ngFromApp(pFd->h
22a30 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
22a40 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65   nMap, NULL);.#e
22a50 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
22a60 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
22a70 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  E).    pFd->hMap
22a80 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
22a90 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20  appingW(pFd->h, 
22aa0 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
22ad0 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
22ae0 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
22af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b10 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
22b20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
22b30 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
22b40 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
22b50 41 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49  AS_ANSI) && SQLI
22b60 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46  TE_WIN32_CREATEF
22b70 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20  ILEMAPPINGA.    
22b80 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
22b90 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
22ba0 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
22bb0 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
22be0 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
22bf0 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
22c20 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
22c30 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  fff), NULL);.#en
22c40 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d  dif.    if( pFd-
22c50 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  >hMap==NULL ){. 
22c60 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72       pFd->lastEr
22c70 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
22c80 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
22c90 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
22ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
22cb0 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , pFd->lastErrno
22cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22cd0 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70           "winMap
22ce0 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61  file1", pFd->zPa
22cf0 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f  th);.      /* Lo
22d00 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74  g the error, but
22d10 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c   continue normal
22d20 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67   operation using
22d30 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f   xRead/xWrite */
22d40 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22d50 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45  "MAP-FILE-CREATE
22d60 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
22d70 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
22d90 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
22da0 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
22db0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
22dc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22dd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
22de0 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70     assert( (nMap
22df0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
22e00 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a  PageSize)==0 );.
22e10 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
22e20 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65  of(SIZE_T)==size
22e30 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  of(sqlite3_int64
22e40 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66  ) || nMap<=0xfff
22e50 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c  fffff );.#if SQL
22e60 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
22e70 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
22e80 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70  wOfFileFromApp(p
22e90 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
22ea0 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
22eb0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  );.#else.    pNe
22ec0 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
22ed0 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66  ile(pFd->hMap, f
22ee0 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a  lags, 0, 0, (SIZ
22ef0 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69  E_T)nMap);.#endi
22f00 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  f.    if( pNew==
22f10 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73  NULL ){.      os
22f20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d  CloseHandle(pFd-
22f30 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46  >hMap);.      pF
22f40 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  d->hMap = NULL;.
22f50 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
22f60 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
22f70 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
22f80 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
22f90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
22fa0 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
22fb0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
22fc0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
22fd0 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50  pfile2", pFd->zP
22fe0 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
22ff0 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
23000 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
23010 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
23020 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
23030 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
23040 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70  ("MAP-FILE-MAP p
23050 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
23060 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
23070 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
23080 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
23090 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
230a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
230b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
230c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
230d0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
230e0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64   = pNew;.    pFd
230f0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61  ->mmapSize = nMa
23100 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  p;.    pFd->mmap
23110 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61  SizeActual = nMa
23120 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  p;.  }..  OSTRAC
23130 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
23140 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
23150 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
23160 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
23170 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
23180 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65  d(), pFd));.  re
23190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
231a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
231b0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
231c0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
231d0 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
231e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
231f0 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
23200 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
23210 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
23220 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
23230 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
23240 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
23250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
23260 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
23270 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
23280 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
23290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
232a0 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
232b0 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
232c0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
232d0 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
232e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
232f0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
23300 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
23310 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
23320 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
23330 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
23340 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
23350 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
23360 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
23370 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
23380 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
23390 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
233a0 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  t eventually.** 
233b0 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
233c0 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
233d0 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a   winUnfetch()..*
233e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
233f0 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
23400 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
23410 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
23420 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
23430 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
23440 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
23450 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
23460 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
23470 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
23480 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
23490 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  *pp = 0;..  OSTR
234a0 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
234b0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
234c0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75  ffset=%lld, amou
234d0 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c  nt=%d, pp=%p\n",
234e0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
234f0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
23500 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e  d(), fd, iOff, n
23510 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20  Amt, pp));..#if 
23520 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
23530 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
23540 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
23550 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
23560 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
23570 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
23580 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  winMapfile(pFd, 
23590 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
235a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
235b0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
235c0 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
235d0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
235e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
235f0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
23600 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
23610 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
23620 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
23630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23640 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
23650 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
23660 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
23670 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
23680 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
23690 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
236a0 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
236b0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
236c0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
236d0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
236e0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25  , pFile=%p, pp=%
236f0 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51  p, *pp=%p, rc=SQ
23700 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
23710 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
23720 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
23730 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20  fd, pp, *pp));. 
23740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23750 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
23760 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
23770 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
23780 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23790 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20  n releases a.** 
237a0 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
237b0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
237c0 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63   call to winFetc
237d0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
237e0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
237f0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
23800 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
23810 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
23820 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
23830 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
23840 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
23850 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
23860 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  on..**.** Or, if
23870 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
23880 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
23890 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
238a0 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a  is being called.
238b0 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
238c0 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
238d0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
238e0 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
238f0 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79  g mapping.** may
23900 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
23910 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
23920 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
23930 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
23940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
23950 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
23960 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
23970 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
23980 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
23990 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
239a0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
239b0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
239c0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70  le */..  /* If p
239d0 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
239e0 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
239f0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
23a00 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20  o outstanding.  
23a10 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ** xFetch refere
23a20 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d  nces. Or, if p!=
23a30 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  0 (meaning it is
23a40 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72   an xFetch refer
23a50 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  ence),.  ** then
23a60 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
23a70 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
23a80 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61  tanding.  */.  a
23a90 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28  ssert( (p==0)==(
23aa0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
23ab0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  0) );..  /* If p
23ac0 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74  !=0, it must mat
23ad0 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75  ch the iOff valu
23ae0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
23af0 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38  p==0 || p==&((u8
23b00 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
23b10 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20  on)[iOff] );..  
23b20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
23b30 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
23b40 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
23b50 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  , p=%p\n",.     
23b60 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
23b70 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
23b80 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a  Fd, iOff, p));..
23b90 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
23ba0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
23bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23bc0 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64   FIXME:  If Wind
23bd0 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73  ows truly always
23be0 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61   prevents trunca
23bf0 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67  ting or deleting
23c00 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77   a.    ** file w
23c10 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69  hile a mapping i
23c20 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65  s held, then the
23c30 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e   following winUn
23c40 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20  mapfile() call. 
23c50 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73     ** is unneces
23c60 73 61 72 79 20 63 61 6e 20 62 65 20 6f 6d 69 74  sary can be omit
23c70 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c  ted - potentiall
23c80 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20  y improving.    
23c90 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  ** performance. 
23ca0 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   */.    winUnmap
23cb0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a  file(pFd);.  }..
23cc0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
23cd0 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23  FetchOut>=0 );.#
23ce0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
23cf0 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25  (("UNFETCH pid=%
23d00 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
23d10 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
23d20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
23d30 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
23d40 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72  ), fd));.  retur
23d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23d60 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
23d70 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
23d80 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
23d90 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
23da0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
23db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
23dc0 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
23dd0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
23de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23df0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
23e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e40 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  */../*.** This v
23e50 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
23e60 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
23e70 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
23e80 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
23e90 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
23ea0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23eb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23ec0 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
23ed0 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
23f00 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
23f30 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f50 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
23f60 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
23f90 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
23fc0 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fe0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
23ff0 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
24020 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20  /.  winLock,    
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24040 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
24050 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20    winUnlock,    
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
24080 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
24090 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
240a0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
240b0 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
240c0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
240e0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
240f0 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24110 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
24120 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
24130 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
24140 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
24150 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
24160 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24180 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
24190 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
241c0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
241d0 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
241e0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
241f0 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
24200 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
24210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
24220 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46  mUnmap */.  winF
24230 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
24240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24250 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e  Fetch */.  winUn
24260 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20  fetch           
24270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
24280 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  nfetch */.};../*
24290 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20  .** This vector 
242a0 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
242b0 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
242c0 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a   operate on an.*
242d0 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66  * sqlite3_file f
242e0 6f 72 20 77 69 6e 33 32 20 77 69 74 68 6f 75 74  or win32 without
242f0 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e 79 20   performing any 
24300 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
24310 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
24320 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
24330 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64 20 3d 20  oNolockMethod = 
24340 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  {.  3,          
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24360 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
24370 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20  */.  winClose,  
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
243a0 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20  /.  winRead,    
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
243d0 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20    winWrite,     
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243f0 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
24400 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20   winTruncate,   
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24420 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
24430 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20  .  winSync,     
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
24460 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20   winFileSize,   
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24480 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
24490 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b  .  winNolockLock
244a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
244b0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
244c0 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b   winNolockUnlock
244d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
244e0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
244f0 20 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52   winNolockCheckR
24500 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
24510 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
24520 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46  edLock */.  winF
24530 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
24540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24550 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
24560 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20   winSectorSize, 
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
24590 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68  */.  winDeviceCh
245a0 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
245b0 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
245c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
245d0 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20  /.  winShmMap,  
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
24600 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
24630 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
24640 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
24650 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
24660 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55  ier */.  winShmU
24670 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
24680 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
24690 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65  Unmap */.  winFe
246a0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
246b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
246c0 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66  etch */.  winUnf
246d0 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  etch            
246e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
246f0 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 73 74 61  fetch */.};..sta
24700 74 69 63 20 77 69 6e 56 66 73 41 70 70 44 61 74  tic winVfsAppDat
24710 61 20 77 69 6e 41 70 70 44 61 74 61 20 3d 20 7b  a winAppData = {
24720 0a 20 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 2c  .  &winIoMethod,
24730 20 20 20 20 20 20 20 2f 2a 20 70 4d 65 74 68 6f         /* pMetho
24740 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  d */.  0,       
24750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
24760 70 70 44 61 74 61 20 2a 2f 0a 20 20 30 20 20 20  ppData */.  0   
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b  /* bNoLock */.};
24790 0a 0a 73 74 61 74 69 63 20 77 69 6e 56 66 73 41  ..static winVfsA
247a0 70 70 44 61 74 61 20 77 69 6e 4e 6f 6c 6f 63 6b  ppData winNolock
247b0 41 70 70 44 61 74 61 20 3d 20 7b 0a 20 20 26 77  AppData = {.  &w
247c0 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64  inIoNolockMethod
247d0 2c 20 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f 0a  , /* pMethod */.
247e0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
247f0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
24800 61 20 2a 2f 0a 20 20 31 20 20 20 20 20 20 20 20  a */.  1        
24810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 4e             /* bN
24820 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a  oLock */.};../**
24830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
24880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24890 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
248a0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
248b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
248c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
248d0 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
248e0 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
248f0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
24900 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
24910 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
24920 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
24930 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a  d(__CYGWIN__)./*
24940 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69  .** Convert a fi
24950 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74  lename from what
24960 65 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79  ever the underly
24970 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
24980 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73  stem.** supports
24990 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69   for filenames i
249a0 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63  nto UTF-8.  Spac
249b0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
249c0 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69  sult is.** obtai
249d0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
249e0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
249f0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
24a00 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
24a10 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f  atic char *winCo
24a20 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
24a30 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ame(const void *
24a40 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
24a50 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ar *zConverted =
24a60 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54   0;.  if( osIsNT
24a70 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
24a80 72 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64  rted = winUnicod
24a90 65 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d  eToUtf8(zFilenam
24aa0 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
24ab0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
24ac0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
24ad0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
24ae0 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 46 69 6c  nMbcsToUtf8(zFil
24af0 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65  ename, osAreFile
24b00 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d  ApisANSI());.  }
24b10 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c  .#endif.  /* cal
24b20 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
24b30 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
24b40 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
24b50 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rted;.}.#endif..
24b60 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
24b70 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
24b80 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
24b90 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
24ba0 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
24bb0 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
24bc0 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
24bd0 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
24be0 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
24bf0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
24c00 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
24c10 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
24c20 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
24c30 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43  tatic void *winC
24c40 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
24c50 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
24c60 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
24c70 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
24c80 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
24c90 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
24ca0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66  nverted = winUtf
24cb0 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
24cc0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
24cd0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
24ce0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
24cf0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
24d00 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a   winUtf8ToMbcs(z
24d10 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46  Filename, osAreF
24d20 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
24d30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
24d40 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
24d50 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
24d60 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
24d70 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
24d80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24d90 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
24da0 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
24db0 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62  d UTF-8 string b
24dc0 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69  uffer.** ends wi
24dd0 74 68 20 61 20 64 69 72 65 63 74 6f 72 79 20 73  th a directory s
24de0 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
24df0 65 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75  er or one was su
24e00 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64  ccessfully.** ad
24e10 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ded to it..*/.st
24e20 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65  atic int winMake
24e30 45 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20  EndInDirSep(int 
24e40 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
24e50 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b  ){.  if( zBuf ){
24e60 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20  .    int nLen = 
24e70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
24e80 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e  zBuf);.    if( n
24e90 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Len>0 ){.      i
24ea0 66 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a  f( winIsDirSep(z
24eb0 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a  Buf[nLen-1]) ){.
24ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
24ed0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
24ee0 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b  ( nLen+1<nBuf ){
24ef0 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c  .        zBuf[nL
24f00 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53  en] = winGetDirS
24f10 65 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  ep();.        zB
24f20 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30  uf[nLen+1] = '\0
24f30 27 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ';.        retur
24f40 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
24f50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24f60 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
24f70 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
24f80 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f  ile name and sto
24f90 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  re the resulting
24fa0 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a   pointer into pz
24fb0 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  Buf..** The poin
24fc0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20  ter returned in 
24fd0 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66 72  pzBuf must be fr
24fe0 65 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  eed via sqlite3_
24ff0 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
25000 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
25010 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
25020 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70   *pVfs, char **p
25030 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
25040 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
25050 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
25060 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
25070 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
25080 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
25090 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
250a0 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20  9";.  size_t i, 
250b0 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20  j;.  int nPre = 
250c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
250d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
250e0 5f 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20  _PREFIX);.  int 
250f0 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72  nMax, nBuf, nDir
25100 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a  , nLen;.  char *
25110 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zBuf;..  /* It's
25120 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
25130 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
25140 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
25150 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
25160 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
25170 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
25180 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
25190 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
251a0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
251b0 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20   failing..  */. 
251c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
251d0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
251e0 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41  IOERR );..  /* A
251f0 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72  llocate a tempor
25200 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 73 74  ary buffer to st
25210 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ore the fully qu
25220 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a  alified file.  *
25230 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74  * name for the t
25240 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
25250 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77  If this fails, w
25260 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75  e cannot continu
25270 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d  e..  */.  nMax =
25280 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
25290 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b  e; nBuf = nMax +
252a0 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c   2;.  zBuf = sql
252b0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
252c0 6e 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a  nBuf );.  if( !z
252d0 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  Buf ){.    OSTRA
252e0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
252f0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
25300 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
25310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25320 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
25330 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  T;.  }..  /* Fig
25340 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65  ure out the effe
25350 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20  ctive temporary 
25360 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73  directory.  Firs
25370 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a  t, check if one.
25380 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78    ** has been ex
25390 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20  plicitly set by 
253a0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b  the application;
253b0 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   otherwise, use 
253c0 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e  the one.  ** con
253d0 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f  figured by the o
253e0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e  perating system.
253f0 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e  .  */.  nDir = n
25400 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35  Max - (nPre + 15
25410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69  );.  assert( nDi
25420 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  r>0 );.  if( sql
25430 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
25440 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ory ){.    int n
25450 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33  DirLen = sqlite3
25460 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
25470 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
25480 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65  ;.    if( nDirLe
25490 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n>0 ){.      if(
254a0 20 21 77 69 6e 49 73 44 69 72 53 65 70 28 73 71   !winIsDirSep(sq
254b0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
254c0 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29  tory[nDirLen-1])
254d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72   ){.        nDir
254e0 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Len++;.      }. 
254f0 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e       if( nDirLen
25500 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20  >nDir ){.       
25510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
25520 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  uf);.        OST
25530 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
25540 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
25550 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20  RROR\n"));.     
25560 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
25570 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
25580 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
25590 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20  mpname1", 0);.  
255a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
255b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
255c0 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73  x, zBuf, "%s", s
255d0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
255e0 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20  ctory);.    }.  
255f0 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  }.#if defined(__
25600 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65  CYGWIN__).  else
25610 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
25620 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
25630 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20  ] = {.       0, 
25640 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54  /* getenv("SQLIT
25650 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  E_TMPDIR") */.  
25660 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
25670 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20  v("TMPDIR") */. 
25680 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
25690 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20  nv("TMP") */.   
256a0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
256b0 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20  ("TEMP") */.    
256c0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
256d0 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a  "USERPROFILE") *
256e0 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74  /.       "/var/t
256f0 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73  mp",.       "/us
25700 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
25710 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e  /tmp",.       ".
25720 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20  ",.       0     
25730 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69     /* List termi
25740 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a  nator */.    };.
25750 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
25760 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   i;.    const ch
25770 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
25780 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30     if( !azDirs[0
25790 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ] ) azDirs[0] = 
257a0 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54  getenv("SQLITE_T
257b0 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28  MPDIR");.    if(
257c0 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
257d0 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
257e0 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  ("TMPDIR");.    
257f0 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29  if( !azDirs[2] )
25800 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74   azDirs[2] = get
25810 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20  env("TMP");.    
25820 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29  if( !azDirs[3] )
25830 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74   azDirs[3] = get
25840 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20  env("TEMP");.   
25850 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20   if( !azDirs[4] 
25860 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65  ) azDirs[4] = ge
25870 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c  tenv("USERPROFIL
25880 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  E");.    for(i=0
25890 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
258a0 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
258b0 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
258c0 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76  s[i++]){.      v
258d0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
258e0 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d  .      if( zDir=
258f0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
25900 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
25910 61 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20  ath starts with 
25920 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66  a drive letter f
25930 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63  ollowed by the c
25940 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  olon.      ** ch
25950 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20  aracter, assume 
25960 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  it is already a 
25970 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
25980 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20  h; otherwise,.  
25990 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62      ** it must b
259a0 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  e converted to a
259b0 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61   native Win32 pa
259c0 74 68 20 76 69 61 20 74 68 65 20 43 79 67 77 69  th via the Cygwi
259d0 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70  n API.      ** p
259e0 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74  rior to using it
259f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25a00 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c   if( winIsDriveL
25a10 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44  etterAndColon(zD
25a20 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ir) ){.        z
25a30 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
25a40 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
25a50 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20  lename(zDir);.  
25a60 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76        if( !zConv
25a70 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20  erted ){.       
25a80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25a90 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
25aa0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
25ab0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
25ac0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
25ad0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
25ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25af0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
25b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25b10 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
25b20 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
25b30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
25b40 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
25b50 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b  uf, "%s", zDir);
25b60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25b70 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25b80 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
25b90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
25ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25bb0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
25bc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25bd0 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65         zConverte
25be0 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  d = sqlite3Mallo
25bf0 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b  cZero( nMax+1 );
25c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
25c10 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
25c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25c30 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
25c40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
25c50 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
25c60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25c70 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
25c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25c90 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
25ca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25cb0 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
25cc0 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
25cd0 20 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54            osIsNT
25ce0 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
25cf0 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
25d00 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44  SIX_TO_WIN_A, zD
25d10 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ir,.            
25d20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20      zConverted, 
25d30 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20  nMax+1)<0 ){.   
25d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25d50 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
25d60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25d70 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
25d80 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
25d90 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
25da0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
25db0 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a  _CONVPATH\n"));.
25dc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
25dd0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
25de0 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
25df0 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
25e00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25e20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
25e30 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  , zDir);.       
25e40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
25e50 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
25e60 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
25e70 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
25e80 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63  t, we know the c
25e90 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74 6f  andidate directo
25ea0 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73 68  ry exists and sh
25eb0 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ould.          *
25ec0 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65  * be used.  Howe
25ed0 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64  ver, we may need
25ee0 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
25ef0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
25f00 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  g.          ** i
25f10 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46  ts name into UTF
25f20 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69  -8 (i.e. if it i
25f30 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e  s UTF-16 right n
25f40 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ow)..          *
25f50 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  /.          char
25f60 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
25f70 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
25f80 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  me(zConverted);.
25f90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
25fa0 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
25fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25fc0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
25fd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25fe0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
25ff0 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
26000 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
26010 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
26020 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
26030 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26040 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26050 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
26060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26070 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
26080 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
26090 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
260a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
260b0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
260c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
260d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
260e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
260f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26100 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
26110 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
26120 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c   }.    }.  }.#el
26130 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
26140 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
26150 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
26160 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  se if( osIsNT() 
26170 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
26180 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20  lti;.    LPWSTR 
26190 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69  zWidePath = sqli
261a0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
261b0 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  Max*sizeof(WCHAR
261c0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57  ) );.    if( !zW
261d0 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  idePath ){.     
261e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
261f0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
26200 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
26210 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
26220 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
26230 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26240 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
26250 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
26260 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
26270 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74  W(nMax, zWidePat
26280 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
26290 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
262a0 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
262b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
262c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
262d0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
262e0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
262f0 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
26300 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
26310 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
26320 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
26330 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
26340 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
26370 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
26380 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69   zMulti = winUni
26390 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
263a0 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
263b0 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
263c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
263d0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
263e0 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
263f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
26400 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
26410 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
26420 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
26430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26440 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
26450 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26460 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
26470 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
26480 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
26490 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
264a0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
264b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
264c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
264d0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
264e0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
264f0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
26500 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68  r *zUtf8;.    ch
26510 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20  ar *zMbcsPath = 
26520 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26530 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69  o( nMax );.    i
26540 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b  f( !zMbcsPath ){
26550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26560 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
26570 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26580 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26590 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
265a0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
265b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
265c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
265d0 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
265e0 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d  mpPathA(nMax, zM
265f0 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  bcsPath)==0 ){. 
26600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26610 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
26620 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26630 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26640 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
26650 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
26660 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
26670 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
26680 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
26690 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266b0 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
266c0 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20  mpname3", 0);.  
266d0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20    }.    zUtf8 = 
266e0 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 4d  winMbcsToUtf8(zM
266f0 62 63 73 50 61 74 68 2c 20 6f 73 41 72 65 46 69  bcsPath, osAreFi
26700 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20  leApisANSI());. 
26710 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
26720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
26730 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
26740 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
26750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26760 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
26770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
26780 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
26790 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
267a0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
267b0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
267c0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
267d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
267e0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
267f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26800 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
26810 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65  2_HAS_ANSI */.#e
26820 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
26830 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f  OS_WINRT */..  /
26840 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  *.  ** Check to 
26850 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65  make sure the te
26860 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
26870 79 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61  y ends with an a
26880 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20  ppropriate.  ** 
26890 73 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69  separator.  If i
268a0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74  t does not and t
268b0 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75  here is not enou
268c0 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f  gh space left to
268d0 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66   add.  ** one, f
268e0 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ail..  */.  if( 
268f0 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72  !winMakeEndInDir
26900 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66  Sep(nDir+1, zBuf
26910 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
26920 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
26930 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26940 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26950 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
26960 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
26970 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
26980 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
26990 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20  mpname4", 0);.  
269a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  }..  /*.  ** Che
269b0 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
269c0 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
269d0 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
269e0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
269f0 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  .  ** name in th
26a00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
26a10 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  at:.  **.  **   
26a20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  "<temporary_dire
26a30 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58  ctory>/etilqs_XX
26a40 58 58 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c  XXXXXXXXXXXXX\0\
26a50 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0".  **.  ** If 
26a60 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
26a70 54 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e  TE_ERROR.  The n
26a80 75 6d 62 65 72 20 31 37 20 69 73 20 75 73 65 64  umber 17 is used
26a90 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
26aa0 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66  o.  ** account f
26ab0 6f 72 20 74 68 65 20 73 70 61 63 65 20 75 73 65  or the space use
26ac0 64 20 62 79 20 74 68 65 20 31 35 20 63 68 61 72  d by the 15 char
26ad0 61 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66  acter random suf
26ae0 66 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a  fix and the.  **
26af0 20 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55   two trailing NU
26b00 4c 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54  L characters.  T
26b10 68 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f  he final directo
26b20 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
26b30 72 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20  racter.  ** has 
26b40 61 6c 72 65 61 64 79 20 61 64 64 65 64 20 69 66  already added if
26b50 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65   it was not alre
26b60 61 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a  ady present..  *
26b70 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74  /.  nLen = sqlit
26b80 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
26b90 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20  ;.  if( (nLen + 
26ba0 6e 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75  nPre + 17) > nBu
26bb0 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  f ){.    sqlite3
26bc0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
26bd0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26be0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26bf0 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
26c00 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
26c10 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
26c20 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
26c30 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20  mpname5", 0);.  
26c40 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  }..  sqlite3_snp
26c50 72 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c  rintf(nBuf-16-nL
26c60 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53  en, zBuf+nLen, S
26c70 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
26c80 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20  PREFIX);..  j = 
26c90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
26ca0 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
26cb0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
26cc0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
26cd0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
26ce0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
26cf0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
26d00 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
26d10 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
26d20 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
26d30 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
26d40 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d  = 0;.  zBuf[j+1]
26d50 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d   = 0;.  *pzBuf =
26d60 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43   zBuf;..  OSTRAC
26d70 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
26d80 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  E name=%s, rc=SQ
26d90 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66  LITE_OK\n", zBuf
26da0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
26db0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26dc0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
26dd0 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69  the named file i
26de0 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63  s really a direc
26df0 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61  tory.  Return fa
26e00 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20  lse if.** it is 
26e10 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
26e20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79  than a directory
26e30 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
26e40 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d   any kind of mem
26e50 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ory.** allocatio
26e60 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
26e70 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69  atic int winIsDi
26e80 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43  r(const void *zC
26e90 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f  onverted){.  DWO
26ea0 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
26eb0 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
26ec0 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28  astErrno;..  if(
26ed0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
26ee0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
26ef0 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
26f00 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
26f10 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
26f20 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
26f30 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
26f40 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
26f50 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
26f60 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
26f70 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
26f80 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fa0 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
26fb0 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fd0 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
26fe0 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72   && winRetryIoer
26ff0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
27000 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
27010 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !rc ){.      ret
27020 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69  urn 0; /* Invali
27030 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d  d name? */.    }
27040 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74  .    attr = sAtt
27050 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
27060 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49  ibutes;.#if SQLI
27070 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
27080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72   }else{.    attr
27090 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
270a0 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
270b0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
270c0 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
270d0 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46  (attr!=INVALID_F
270e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20  ILE_ATTRIBUTES) 
270f0 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54  && (attr&FILE_AT
27100 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
27110 59 29 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72  Y);.}../* forwar
27120 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
27130 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63  tatic int winAcc
27140 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
27150 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
27160 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
27170 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
27180 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
27190 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
271a0 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
271b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271d0 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20  /* Type of test 
271e0 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20  to make on this 
271f0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  file */.  int *p
27200 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
27210 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73       /* OUT: Res
27220 75 6c 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ult */.);../*.**
27230 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f   Open a file..*/
27240 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
27250 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
27260 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
27270 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20   /* Used to get 
27280 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6c 65 6e  maximum path len
27290 67 74 68 20 61 6e 64 20 41 70 70 44 61 74 61 20  gth and AppData 
272a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
272b0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
272c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
272d0 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
272e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
272f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
27300 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
27310 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
27320 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27340 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
27350 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
27360 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
27370 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
27380 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
27390 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
273a0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
273b0 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
273c0 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
273d0 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
273e0 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
273f0 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
27400 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
27410 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
27420 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
27430 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
27440 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
27450 6e 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70  nVfsAppData *pAp
27460 70 44 61 74 61 3b 0a 20 20 77 69 6e 46 69 6c 65  pData;.  winFile
27470 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
27480 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
27490 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20  zConverted;     
274a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
274b0 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64  name in OS encod
274c0 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
274d0 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d  har *zUtf8Name =
274e0 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e   zName; /* Filen
274f0 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63  ame in UTF-8 enc
27500 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63  oding */.  int c
27510 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  nt = 0;..  /* If
27520 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
27530 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
27540 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
27550 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
27560 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
27570 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
27580 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
27590 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
275a0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
275b0 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30  ar *zTmpname = 0
275c0 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  ; /* For tempora
275d0 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20  ry filename, if 
275e0 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20  necessary. */.. 
275f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27600 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27610 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
27620 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21  rn Code */.#if !
27630 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
27640 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
27650 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  CE.  int eType =
27660 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
27670 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
27680 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
27690 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45  endif..  int isE
276a0 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
276b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
276c0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
276d0 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
276e0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
276f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
27700 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
27710 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
27720 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
27730 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
27740 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
27750 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
27760 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
27770 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
27780 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
27790 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
277a0 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  TE);..#ifndef ND
277b0 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65  EBUG.  int isOpe
277c0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72  nJournal = (isCr
277d0 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
277e0 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
277f0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
27800 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  NAL.     || eTyp
27810 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
27820 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  AIN_JOURNAL.    
27830 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27840 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
27850 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
27860 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
27870 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61  s, pFile=%p, fla
27880 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73  gs=%x, pOutFlags
27890 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
278a0 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64     zUtf8Name, id
278b0 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
278c0 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  gs));..  /* Chec
278d0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
278e0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
278f0 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
27900 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
27910 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
27920 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
27930 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
27940 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29  , and.  **   (b)
27950 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
27960 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
27970 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
27980 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
27990 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
279a0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
279b0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
279c0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
279d0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
279e0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
279f0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
27a00 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
27a10 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
27a20 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
27a30 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
27a40 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
27a50 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
27a60 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
27a70 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
27a80 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
27a90 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
27aa0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
27ab0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
27ac0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
27ad0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
27ae0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
27af0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
27b00 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20  rnal are never. 
27b10 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
27b20 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
27b30 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
27b40 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
27b50 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
27b60 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
27b70 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
27b80 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
27b90 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
27ba0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
27bb0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
27bc0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
27bd0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
27be0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
27bf0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
27c00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
27c10 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
27c20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
27c30 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
27c40 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
27c50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
27c60 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
27c70 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
27c80 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
27c90 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
27ca0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
27cb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
27cc0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
27cd0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
27ce0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20  OPEN_TEMP_DB.   
27cf0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
27d00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
27d10 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
27d20 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
27d30 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20  P_JOURNAL.      
27d40 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27d50 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
27d60 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
27d70 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
27d80 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20  _JOURNAL.       
27d90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
27da0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
27db0 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
27dc0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
27dd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
27de0 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  le!=0 );.  memse
27df0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
27e00 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20  of(winFile));.  
27e10 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
27e20 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
27e30 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
27e40 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74  WINRT.  if( !zUt
27e50 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74  f8Name && !sqlit
27e60 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
27e70 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
27e80 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
27e90 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69  R,.        "sqli
27ea0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
27eb0 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  ry variable shou
27ec0 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69  ld be set for Wi
27ed0 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nRT");.  }.#endi
27ee0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  f..  /* If the s
27ef0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
27f00 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
27f10 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
27f20 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  e a.  ** tempora
27f30 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  ry file name to 
27f40 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  use.  */.  if( !
27f50 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
27f60 20 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74   assert( isDelet
27f70 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72  e && !isOpenJour
27f80 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  nal );.    rc = 
27f90 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
27fa0 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b  Vfs, &zTmpname);
27fb0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27fd0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
27fe0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20  ame=%s, rc=%s", 
27ff0 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74  zUtf8Name, sqlit
28000 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
28010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
28030 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
28040 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61  ;.  }..  /* Data
28050 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
28060 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
28070 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
28080 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55  y are not.  ** U
28090 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
280a0 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
280b0 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
280c0 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
280d0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
280e0 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  ameter()..  */. 
280f0 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21   assert( (eType!
28100 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
28110 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20  N_DB) || (flags 
28120 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
28130 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74  I) ||.       zUt
28140 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  f8Name[sqlite3St
28150 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65  rlen30(zUtf8Name
28160 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  )+1]==0 );..  /*
28170 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
28180 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
28190 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
281a0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
281b0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
281c0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
281d0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
281e0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
281f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28200 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
28210 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
28220 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
28230 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55  IOERR_NOMEM", zU
28240 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
28250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
28260 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
28270 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44   }..  if( winIsD
28280 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
28290 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
282a0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
282b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
282c0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
282d0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
282e0 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
282f0 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
28300 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
28310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28320 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
28330 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
28340 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
28350 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
28360 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
28370 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
28380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
28390 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
283a0 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
283b0 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
283c0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
283d0 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
283e0 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
283f0 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74 65  e is.  ** create
28400 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
28410 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
28420 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
28430 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73 20  access".  ** as 
28440 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e  it is usually un
28450 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20  derstood..  */. 
28460 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
28470 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
28480 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
28490 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
284a0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
284b0 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
284c0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
284d0 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
284e0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
284f0 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
28500 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
28510 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
28520 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e   /* Open existin
28530 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74  g file, or creat
28540 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  e if it doesn't 
28550 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43  exist */.    dwC
28560 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
28570 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
28580 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
28590 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20  * Opens a file, 
285a0 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74  only if it exist
285b0 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
285c0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
285d0 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b  = OPEN_EXISTING;
285e0 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d  .  }..  dwShareM
285f0 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
28600 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
28610 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28  RE_WRITE;..  if(
28620 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
28630 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
28640 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
28650 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
28660 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
28670 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20  N;.    isTemp = 
28680 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46  1;.#else.    dwF
28690 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
286a0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
286b0 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20  TE_TEMPORARY.   
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
286e0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
286f0 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEN.            
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
28720 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
28730 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
28740 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
28750 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
28760 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
28770 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72  ;.  }.  /* Repor
28780 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ts from the inte
28790 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65  rnet are that pe
287a0 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77  rformance is alw
287b0 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20  ays.  ** better 
287c0 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  if FILE_FLAG_RAN
287d0 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73  DOM_ACCESS is us
287e0 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39  ed.  Ticket #269
287f0 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  9. */.#if SQLITE
28800 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c  _OS_WINCE.  dwFl
28810 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
28820 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
28830 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e  NDOM_ACCESS;.#en
28840 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  dif..  if( osIsN
28850 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
28860 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43  E_OS_WINRT.    C
28870 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
28880 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65  DED_PARAMETERS e
28890 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
288a0 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  s;.    extendedP
288b0 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65  arameters.dwSize
288c0 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45   = sizeof(CREATE
288d0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
288e0 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20  ARAMETERS);.    
288f0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
28900 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  rs.dwFileAttribu
28910 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tes =.          
28920 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
28930 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54  ibutes & FILE_AT
28940 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20  TRIBUTE_MASK;.  
28950 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
28960 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73  ters.dwFileFlags
28970 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74   = dwFlagsAndAtt
28980 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46  ributes & FILE_F
28990 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  LAG_MASK;.    ex
289a0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
289b0 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c  .dwSecurityQosFl
289c0 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41  ags = SECURITY_A
289d0 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78  NONYMOUS;.    ex
289e0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
289f0 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69  .lpSecurityAttri
28a00 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  butes = NULL;.  
28a10 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
28a20 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69  ters.hTemplateFi
28a30 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  le = NULL;.    d
28a40 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43  o{.      h = osC
28a50 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
28a60 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
28a90 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
28ae0 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
28b10 72 61 6d 65 74 65 72 73 29 3b 0a 20 20 20 20 20  rameters);.     
28b20 20 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44 5f   if( h!=INVALID_
28b30 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20 62  HANDLE_VALUE ) b
28b40 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
28b50 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
28b60 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 2c 20         int rc2, 
28b70 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20 20  isRO = 0;.      
28b80 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
28b90 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
28ba0 20 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e 41        rc2 = winA
28bb0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61 6d  ccess(pVfs, zNam
28bc0 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  e, SQLITE_ACCESS
28bd0 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a 20  _READ, &isRO);. 
28be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
28bf0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
28c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
28c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
28c20 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sRO ) break;.   
28c30 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
28c40 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
28c50 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
28c60 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 6f   );.#else.    do
28c70 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72  {.      h = osCr
28c80 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
28c90 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
28cc0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
28cf0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
28d00 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
28d10 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
28d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28d30 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
28d40 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d60 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20          NULL);. 
28d70 20 20 20 20 20 69 66 28 20 68 21 3d 49 4e 56 41       if( h!=INVA
28d80 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
28d90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28da0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
28db0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
28dc0 63 32 2c 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20  c2, isRO = 0;.  
28dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
28de0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
28df0 3b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  ;.        rc2 = 
28e00 77 69 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20  winAccess(pVfs, 
28e10 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43  zName, SQLITE_AC
28e20 43 45 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f  CESS_READ, &isRO
28e30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28e40 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
28e50 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
28e60 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
28e70 26 26 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b  && isRO ) break;
28e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
28e90 69 6c 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65  ile( winRetryIoe
28ea0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
28eb0 72 6e 6f 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  rno) );.#endif. 
28ec0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
28ed0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
28ee0 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 7b 0a    else{.    do{.
28ef0 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72 65 61        h = osCrea
28f00 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29  teFileA((LPCSTR)
28f10 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f30 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
28f40 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
28f60 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
28f90 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fb0 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
28fc0 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20       NULL);.    
28ff0 20 20 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44    if( h!=INVALID
29000 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20  _HANDLE_VALUE ) 
29010 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
29020 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
29030 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 2c          int rc2,
29040 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20   isRO = 0;.     
29050 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
29060 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
29070 20 20 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e         rc2 = win
29080 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61  Access(pVfs, zNa
29090 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  me, SQLITE_ACCES
290a0 53 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a  S_READ, &isRO);.
290b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
290c0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
290d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
290e0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  2==SQLITE_OK && 
290f0 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20  isRO ) break;.  
29100 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
29110 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
29120 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
29130 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) );.  }.#endif.
29140 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
29150 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20  t, __LINE__);.. 
29160 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
29170 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
29180 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63  , access=%lx, rc
29190 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
291a0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
291b0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
291c0 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
291d0 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
291e0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
291f0 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
29200 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
29210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
29220 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29240 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
29250 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
29260 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
29270 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29280 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
29290 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20  Name, id,.      
292a0 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
292b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
292c0 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   &.             
292d0 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45          ~(SQLITE
292e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
292f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
29300 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70  TE)),.         p
29310 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
29320 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
29330 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
29340 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
29350 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
29360 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69  TE_CANTOPEN, pFi
29370 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22  le->lastErrno, "
29380 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e  winOpen", zUtf8N
29390 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
293a0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
293b0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
293c0 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   }..  if( pOutFl
293d0 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ags ){.    if( i
293e0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
293f0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
29400 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
29410 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  DWRITE;.    }els
29420 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  e{.      *pOutFl
29430 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
29440 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
29450 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  }.  }..  OSTRACE
29460 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
29470 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
29480 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  =%lx, pOutFlags=
29490 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25  %p, *pOutFlags=%
294a0 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
294b0 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55  "rc=%s\n", h, zU
294c0 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  tf8Name, dwDesir
294d0 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c  edAccess, pOutFl
294e0 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f  ags, pOutFlags ?
294f0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75  .           *pOu
29500 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d  tFlags : 0, (h==
29510 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
29520 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
29530 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 70 41   : "ok"));..  pA
29540 70 70 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73  ppData = (winVfs
29550 41 70 70 44 61 74 61 2a 29 70 56 66 73 2d 3e 70  AppData*)pVfs->p
29560 41 70 70 44 61 74 61 3b 0a 0a 23 69 66 20 53 51  AppData;..#if SQ
29570 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
29580 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  {.    if( isRead
29590 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
295a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
295b0 5f 44 42 0a 20 20 20 20 20 20 20 20 20 26 26 20  _DB.         && 
295c0 28 28 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c  ((pAppData==NULL
295d0 29 20 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e  ) || !pAppData->
295e0 62 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20 20 20 20  bNoLock).       
295f0 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65    && (rc = wince
29600 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
29610 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54  , pFile))!=SQLIT
29620 45 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20 20 20  E_OK.    ){.    
29630 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
29640 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
29650 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29660 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
29670 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
29680 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
29690 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e  ("OPEN-CE-LOCK n
296a0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22  ame=%s, rc=%s\n"
296b0 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  , zName, sqlite3
296c0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
296d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
296e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
296f0 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
29700 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
29710 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
29720 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
29730 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
29740 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29750 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
29760 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
29770 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
29780 6f 64 20 3d 20 70 41 70 70 44 61 74 61 20 3f 20  od = pAppData ? 
29790 70 41 70 70 44 61 74 61 2d 3e 70 4d 65 74 68 6f  pAppData->pMetho
297a0 64 20 3a 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d : &winIoMethod
297b0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20  ;.  pFile->pVfs 
297c0 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d  = pVfs;.  pFile-
297d0 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73  >h = h;.  if( is
297e0 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
297f0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
29800 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e   |= WINFILE_RDON
29810 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  LY;.  }.  if( sq
29820 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
29830 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  n(zName, "psow",
29840 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
29850 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
29860 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
29870 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
29880 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  PSOW;.  }.  pFil
29890 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
298a0 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
298b0 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
298c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
298d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46  MMAP_SIZE>0.  pF
298e0 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
298f0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ;.  pFile->pMapR
29900 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69  egion = 0;.  pFi
29910 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
29920 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
29930 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
29940 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
29950 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
29960 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
29970 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e  ;.#endif..  Open
29980 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
29990 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
299a0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
299b0 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
299c0 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77  Note that Window
299d0 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
299e0 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
299f0 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
29a00 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
29a10 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
29a20 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
29a30 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
29a40 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
29a50 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
29a60 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
29a70 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
29a80 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
29a90 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
29aa0 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
29ab0 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
29ac0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
29ad0 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
29ae0 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
29af0 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
29b00 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
29b10 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
29b20 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
29b30 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
29b40 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
29b50 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
29b60 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
29b70 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
29b80 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
29b90 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
29ba0 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
29bb0 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
29bc0 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a   int winDelete(.
29bd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
29be0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs,          /*
29bf0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
29c00 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
29c10 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
29c20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
29c30 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ile to delete */
29c40 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20  .  int syncDir  
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c60 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
29c70 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n32 */.){.  int 
29c80 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  cnt = 0;.  int r
29c90 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  c;.  DWORD attr;
29ca0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
29cb0 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  no = 0;.  void *
29cc0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
29cd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29ce0 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vfs);.  UNUSED_P
29cf0 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72  ARAMETER(syncDir
29d00 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
29d10 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
29d20 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
29d30 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
29d40 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73  ELETE name=%s, s
29d50 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46  yncDir=%d\n", zF
29d60 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72  ilename, syncDir
29d70 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ));..  zConverte
29d80 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
29d90 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
29da0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
29db0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
29dc0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
29dd0 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
29de0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
29df0 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e  NOMEM\n", zFilen
29e00 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
29e10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29e20 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
29e30 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
29e40 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51  .    do {.#if SQ
29e50 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
29e60 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
29e70 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
29e80 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d  ttrData;.      m
29e90 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
29ea0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
29eb0 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69  rData));.      i
29ec0 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  f ( osGetFileAtt
29ed0 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76  ributesExW(zConv
29ee0 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78  erted, GetFileEx
29ef0 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20  &sAttrData) ){. 
29f30 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
29f40 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
29f50 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
29f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c  }else{.        l
29f70 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
29f80 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
29f90 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
29fa0 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
29fb0 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
29fc0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
29fd0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
29fe0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
29ff0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2a000 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
2a010 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
2a020 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
2a030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2a040 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2a050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a070 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61   }.#else.      a
2a080 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
2a090 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
2a0a0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
2a0b0 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
2a0c0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
2a0d0 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
2a0e0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
2a0f0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
2a100 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
2a110 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
2a120 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
2a130 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
2a140 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
2a150 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
2a160 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a170 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
2a180 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
2a190 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
2a1a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a1b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2a1c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
2a1d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
2a1f0 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
2a200 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
2a210 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2a220 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
2a230 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
2a240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
2a260 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28  ( osDeleteFileW(
2a270 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
2a280 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a290 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
2a2a0 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
2a2b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a2c0 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
2a2d0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
2a2e0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
2a2f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a300 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
2a310 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
2a320 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
2a340 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64  ile(1);.  }.#ifd
2a350 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2a360 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
2a370 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
2a380 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
2a390 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
2a3a0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69  verted);.      i
2a3b0 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
2a3c0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
2a3d0 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
2a3e0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
2a3f0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
2a400 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
2a410 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
2a420 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
2a430 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
2a440 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
2a450 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
2a460 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2a470 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
2a480 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
2a490 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
2a4a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
2a4b0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2a4c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a4d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a4e0 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
2a4f0 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
2a500 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
2a510 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a520 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
2a530 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
2a540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a550 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
2a560 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
2a570 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
2a580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a590 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
2a5a0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
2a5b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a5c0 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
2a5d0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
2a5e0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
2a5f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2a600 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
2a610 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
2a620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a630 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
2a640 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
2a650 66 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c  f( rc && rc!=SQL
2a660 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2a670 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63  _NOENT ){.    rc
2a680 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
2a690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2a6a0 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  TE, lastErrno, "
2a6b0 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
2a6c0 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
2a6d0 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
2a6e0 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  (cnt, __LINE__);
2a6f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2a700 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
2a710 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
2a720 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
2a730 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
2a740 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
2a750 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
2a760 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
2a770 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63  eck the existenc
2a780 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
2a790 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
2a7a0 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
2a7b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2a7c0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
2a7d0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
2a7e0 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
2a7f0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
2a800 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
2a810 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
2a820 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2a830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a840 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
2a850 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
2a860 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
2a870 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
2a880 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
2a890 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
2a8a0 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
2a8b0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
2a8c0 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
2a8d0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
2a8e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a8f0 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  pVfs);..  Simula
2a900 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2a910 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2a920 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52  CCESS; );.  OSTR
2a930 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
2a940 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%s, flags=%x, 
2a950 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20  pResOut=%p\n",. 
2a960 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
2a970 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ame, flags, pRes
2a980 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Out));..  zConve
2a990 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
2a9a0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
2a9b0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
2a9c0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
2a9d0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
2a9e0 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
2a9f0 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
2aa00 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
2aa10 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
2aa20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2aa30 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2aa40 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
2aa50 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
2aa60 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
2aa70 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
2aa80 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
2aa90 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
2aaa0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
2aab0 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
2aac0 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
2aad0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2aae0 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
2aaf0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab10 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
2ab20 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
2ab50 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65  rData)) && winRe
2ab60 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
2ab70 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
2ab80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ab90 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
2aba0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2abb0 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
2abc0 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
2abd0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
2abe0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
2abf0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
2ac00 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
2ac10 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
2ac20 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
2ac30 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
2ac40 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20  leSizeHigh==0.  
2ac50 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
2ac60 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
2ac70 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
2ac80 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
2ac90 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
2aca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2acb0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
2acc0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
2acd0 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
2ace0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2acf0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
2ad00 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2ad10 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
2ad20 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  !=ERROR_FILE_NOT
2ad30 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72  _FOUND && lastEr
2ad40 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno!=ERROR_PATH_
2ad50 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
2ad60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ad70 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2ad80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
2ad90 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
2ada0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c  _IOERR_ACCESS, l
2adb0 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63  astErrno, "winAc
2adc0 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20  cess",.         
2add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ade0 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20    zFilename);.  
2adf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ae00 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
2ae10 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
2ae20 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  S;.      }.    }
2ae30 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
2ae40 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
2ae50 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74  I.  else{.    at
2ae60 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
2ae70 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
2ae80 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
2ae90 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
2aea0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2aeb0 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ed);.  switch( f
2aec0 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
2aed0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2aee0 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51  EAD:.    case SQ
2aef0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2af00 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TS:.      rc = a
2af10 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
2af20 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
2af30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2af40 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2af50 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
2af60 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
2af70 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
2af80 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20  BUTES &&.       
2af90 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49        (attr & FI
2afa0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41  LE_ATTRIBUTE_REA
2afb0 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20  DONLY)==0;.     
2afc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
2afd0 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
2afe0 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
2aff0 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
2b000 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
2b010 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  c;.  OSTRACE(("A
2b020 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70  CCESS name=%s, p
2b030 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
2b040 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
2b050 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
2b060 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70      zFilename, p
2b070 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74  ResOut, *pResOut
2b080 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
2b090 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2b0a0 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
2b0b0 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
2b0c0 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  ed path name sta
2b0d0 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65  rts with a drive
2b0e0 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f   letter.** follo
2b0f0 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63  wed by a colon c
2b100 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
2b110 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72  tic BOOL winIsDr
2b120 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
2b130 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
2b140 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
2b150 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33  return ( sqlite3
2b160 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d  Isalpha(zPathnam
2b170 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61  e[0]) && zPathna
2b180 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a  me[1]==':' );.}.
2b190 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
2b1a0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
2b1b0 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
2b1c0 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  me should be use
2b1d0 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a  d verbatim.  If.
2b1e0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  ** non-zero is r
2b1f0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69  eturned from thi
2b200 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20  s function, the 
2b210 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2b220 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20   must simply.** 
2b230 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64  use the provided
2b240 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61   path name verba
2b250 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65  tim -OR- resolve
2b260 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20   it into a full 
2b270 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69  path name.** usi
2b280 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61  ng the GetFullPa
2b290 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49  thName Win32 API
2b2a0 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76   function (if av
2b2b0 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  ailable)..*/.sta
2b2c0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65  tic BOOL winIsVe
2b2d0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a  rbatimPathname(.
2b2e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2b2f0 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a  athname.){.  /*.
2b300 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
2b310 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
2b320 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73  h a forward slas
2b330 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68  h or a backslash
2b340 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20  , it is either. 
2b350 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20   ** a legal UNC 
2b360 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72  name, a volume r
2b370 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72  elative path, or
2b380 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
2b390 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20  h name in the.  
2b3a0 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74  ** "Unix" format
2b3b0 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68   on Windows.  Th
2b3c0 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77  ere is no easy w
2b3d0 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69  ay to differenti
2b3e0 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a  ate between.  **
2b3f0 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63   the final two c
2b400 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ases; therefore,
2b410 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73   we return the s
2b420 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  afer return valu
2b430 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73  e of TRUE.  ** s
2b440 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f  o that callers o
2b450 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2b460 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20  will simply use 
2b470 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a  it verbatim..  *
2b480 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 69  /.  if ( winIsDi
2b490 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30  rSep(zPathname[0
2b4a0 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
2b4b0 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
2b4c0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
2b4d0 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
2b4e0 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20  th a letter and 
2b4f0 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69  a colon it is ei
2b500 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20  ther a volume.  
2b510 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  ** relative path
2b520 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
2b530 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f  path.  Callers o
2b540 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2b550 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74  must not.  ** at
2b560 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69  tempt to treat i
2b570 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20  t as a relative 
2b580 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20  path name (i.e. 
2b590 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70  they should simp
2b5a0 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76  ly use.  ** it v
2b5b0 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20  erbatim)..  */. 
2b5c0 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76 65   if ( winIsDrive
2b5d0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
2b5e0 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20  Pathname) ){.   
2b5f0 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
2b600 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
2b610 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  we get to this p
2b620 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e  oint, the path n
2b630 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73  ame should almos
2b640 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61  t certainly be a
2b650 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c   purely.  ** rel
2b660 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20  ative one (i.e. 
2b670 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20  not a UNC name, 
2b680 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e  not absolute, an
2b690 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c  d not volume rel
2b6a0 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72  ative)..  */.  r
2b6b0 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a  eturn FALSE;.}..
2b6c0 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
2b6d0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
2b6e0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
2b6f0 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ame.  Write the 
2b700 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65  full.** pathname
2b710 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a   into zOut[].  z
2b720 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74  Out[] will be at
2b730 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50   least pVfs->mxP
2b740 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73  athname.** bytes
2b750 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
2b760 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50  tic int winFullP
2b770 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
2b780 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2b790 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2b7a0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
2b7b0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2b7c0 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20  r *zRelative,   
2b7d0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
2b7e0 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
2b7f0 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
2b800 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
2b810 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2b820 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
2b830 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
2b840 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20  har *zFull      
2b850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b860 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
2b870 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
2b880 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
2b890 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2b8a0 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
2b8b0 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79  N__).  DWORD nBy
2b8c0 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
2b8d0 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
2b8e0 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  zOut;.#endif..  
2b8f0 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20  /* If this path 
2b900 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
2b910 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58   "/X:", where "X
2b920 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65  " is any alphabe
2b930 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  tic.  ** charact
2b940 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  er, discard the 
2b950 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d  initial "/" from
2b960 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20   the pathname.. 
2b970 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74   */.  if( zRelat
2b980 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77  ive[0]=='/' && w
2b990 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
2b9a0 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76  ndColon(zRelativ
2b9b0 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c  e+1) ){.    zRel
2b9c0 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 23 69  ative++;.  }..#i
2b9d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
2b9e0 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
2b9f0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2ba00 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
2ba10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ba20 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73  ER(nFull);.  ass
2ba30 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73  ert( nFull>=pVfs
2ba40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
2ba50 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
2ba60 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
2ba70 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
2ba80 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
2ba90 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
2baa0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
2bab0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2bac0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2bad0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
2bae0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
2baf0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
2bb00 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
2bb10 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
2bb20 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
2bb30 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
2bb40 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
2bb50 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
2bb60 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
2bb70 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
2bb80 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
2bb90 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73  irectory and a s
2bba0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
2bbb0 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
2bbc0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2bbd0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2bbe0 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  e+1 );.    if( !
2bbf0 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65  zOut ){.      re
2bc00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2bc10 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2bc20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77    }.    if( cygw
2bc30 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20  in_conv_path(.  
2bc40 20 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e            (osIsN
2bc50 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f  T() ? CCP_POSIX_
2bc60 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50  TO_WIN_W : CCP_P
2bc70 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c  OSIX_TO_WIN_A) |
2bc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 43 50  .            CCP
2bc90 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61  _RELATIVE, zRela
2bca0 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73  tive, zOut, pVfs
2bcb0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c  ->mxPathname+1)<
2bcc0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2bcd0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2bce0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2bcf0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2bd00 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
2bd10 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd30 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
2bd40 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65  lPathname1", zRe
2bd50 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c  lative);.    }el
2bd60 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
2bd70 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
2bd80 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
2bd90 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (zOut);.      if
2bda0 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
2bdb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bdc0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
2bdd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2bde0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2bdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2be00 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2be10 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2be20 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2be30 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
2be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
2be60 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
2be70 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74  GetDirSep(), zUt
2be80 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
2be90 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
2bea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2beb0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(zOut);.    }.
2bec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
2bed0 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
2bee0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
2bef0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
2bf00 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
2bf10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bf20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2bf30 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2bf40 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
2bf50 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
2bf60 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
2bf70 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
2bf80 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
2bf90 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20  _TO_WIN_A),.    
2bfa0 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76          zRelativ
2bfb0 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
2bfc0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
2bfd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2bfe0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
2bff0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
2c000 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2c010 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
2c020 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c040 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
2c050 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74  thname2", zRelat
2c060 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
2c070 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
2c080 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
2c090 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
2c0a0 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
2c0b0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
2c0c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
2c0d0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
2c0e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2c0f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2c100 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2c110 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
2c120 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
2c130 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
2c140 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
2c150 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c160 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
2c170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
2c180 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2c190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c1a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53  ;.#endif..#if (S
2c1b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
2c1c0 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
2c1d0 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  T) && !defined(_
2c1e0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
2c1f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2c200 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2c210 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  R );.  /* WinCE 
2c220 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
2c230 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
2c240 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
2c250 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20  m told. */.  /* 
2c260 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79  WinRT has no way
2c270 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65   to convert a re
2c280 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61  lative path to a
2c290 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20  n absolute one. 
2c2a0 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  */.  if ( sqlite
2c2b0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
2c2c0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
2c2d0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
2c2e0 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
2c2f0 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
2c300 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2c310 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2c320 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
2c330 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
2c340 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2c350 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
2c360 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
2c370 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
2c380 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
2c390 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
2c3a0 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
2c3b0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
2c3c0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
2c3d0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
2c3e0 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
2c3f0 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
2c400 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2c410 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
2c420 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
2c430 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
2c440 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%c%s",.        
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c460 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
2c470 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
2c480 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  p(), zRelative);
2c490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2c4a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2c4b0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2c4c0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2c4d0 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
2c4e0 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ive);.  }.  retu
2c4f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
2c500 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
2c510 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
2c520 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2c530 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
2c540 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49 74 27 73  WIN__).  /* It's
2c550 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
2c560 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
2c570 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
2c580 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
2c590 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
2c5a0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
2c5b0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
2c5c0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
2c5d0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
2c5e0 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
2c5f0 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
2c600 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
2c610 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
2c620 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
2c630 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
2c640 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
2c650 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2c660 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2c670 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
2c680 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
2c690 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
2c6a0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
2c6b0 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
2c6c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
2c6d0 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
2c6e0 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
2c6f0 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
2c700 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
2c710 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2c720 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
2c730 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
2c740 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
2c750 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
2c760 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
2c770 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
2c780 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
2c790 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
2c7a0 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
2c7b0 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
2c7c0 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
2c7d0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
2c7e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2c7f0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2c800 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2c810 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c830 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
2c840 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
2c850 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
2c860 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
2c870 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2c880 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
2c890 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2c8a0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
2c8b0 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
2c8c0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
2c8d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c8e0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2c8f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
2c900 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53  NT() ){.    LPWS
2c910 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  TR zTemp;.    nB
2c920 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2c930 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
2c940 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  R)zConverted, 0,
2c950 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
2c960 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
2c970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c980 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2c990 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
2c9a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2c9b0 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
2c9c0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2c9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c9e0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
2c9f0 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
2ca00 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
2ca10 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
2ca20 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
2ca30 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
2ca40 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
2ca50 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
2ca60 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
2ca70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ca80 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2ca90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2caa0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2cab0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  T;.    }.    nBy
2cac0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2cad0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
2cae0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
2caf0 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
2cb00 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2cb10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2cb20 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2cb30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2cb40 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2cb50 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2cb60 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2cb70 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2cb80 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2cb90 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2cbb0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20  FullPathname2", 
2cbc0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2cbd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2cbe0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2cbf0 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
2cc00 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
2cc10 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
2cc20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
2cc30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
2cc40 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
2cc50 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
2cc60 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
2cc70 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
2cc80 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
2cc90 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
2cca0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
2ccb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2ccc0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2ccd0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
2cce0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
2ccf0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2cd00 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
2cd10 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
2cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd30 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2cd40 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69  hname3", zRelati
2cd50 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
2cd60 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
2cd70 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
2cd80 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
2cd90 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
2cda0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
2cdb0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
2cdc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2cdd0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
2cde0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2cdf0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2ce00 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
2ce10 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
2ce20 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
2ce30 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
2ce40 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
2ce50 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
2ce60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ce70 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2ce80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ce90 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
2cea0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
2ceb0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2cec0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
2ced0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cef0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2cf00 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69  hname4", zRelati
2cf10 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
2cf20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2cf30 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
2cf40 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  t = winMbcsToUtf
2cf50 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46 69  8(zTemp, osAreFi
2cf60 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20  leApisANSI());. 
2cf70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2cf80 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  zTemp);.  }.#end
2cf90 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b  if.  if( zOut ){
2cfa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2cfb0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2cfc0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2cfd0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
2cfe0 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
2cff0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
2d000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d010 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2d020 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d030 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2d040 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  T;.  }.#endif.}.
2d050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d060 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2d070 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
2d080 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
2d090 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
2d0a0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
2d0b0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
2d0c0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
2d0d0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
2d0e0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
2d0f0 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
2d100 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
2d110 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2d120 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
2d130 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
2d140 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e  DLE h;.#if defin
2d150 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
2d160 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66   int nFull = pVf
2d170 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2d180 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d  .  char *zFull =
2d190 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
2d1a0 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76  ro( nFull );.  v
2d1b0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
2d1c0 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c  = 0;.  if( zFull
2d1d0 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
2d1e0 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2d1f0 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2d200 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2d210 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2d220 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
2d230 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  ( winFullPathnam
2d240 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2d250 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29  e, nFull, zFull)
2d260 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d270 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d280 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52  zFull);.    OSTR
2d290 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2d2a0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2d2b0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2d2c0 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72  void*)0));.    r
2d2d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
2d2e0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
2d2f0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
2d300 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20  lename(zFull);. 
2d310 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
2d320 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f  ull);.#else.  vo
2d330 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
2d340 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
2d350 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
2d360 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
2d370 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2d380 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
2d390 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
2d3a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c      OSTRACE(("DL
2d3b0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
2d3c0 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
2d3d0 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29  ename, (void*)0)
2d3e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2d3f0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
2d400 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
2d410 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68  E_OS_WINRT.    h
2d420 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65   = osLoadPackage
2d430 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54  dLibrary((LPCWST
2d440 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29  R)zConverted, 0)
2d450 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20  ;.#else.    h = 
2d460 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28  osLoadLibraryW((
2d470 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
2d480 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
2d490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2d4a0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
2d4b0 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c  lse{.    h = osL
2d4c0 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61  oadLibraryA((cha
2d4d0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
2d4e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
2d4f0 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2d500 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2d510 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2d520 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71  (void*)h));.  sq
2d530 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2d540 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  erted);.  return
2d550 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61   (void*)h;.}.sta
2d560 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72  tic void winDlEr
2d570 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2d580 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
2d590 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
2d5a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d5b0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e  TER(pVfs);.  win
2d5c0 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
2d5d0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2d5e0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29  , nBuf, zBufOut)
2d5f0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2d600 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
2d610 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69  e3_vfs *pVfs,voi
2d620 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72  d *pH,const char
2d630 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a   *zSym))(void){.
2d640 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a    FARPROC proc;.
2d650 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d660 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63  ER(pVfs);.  proc
2d670 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72   = osGetProcAddr
2d680 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c  essA((HANDLE)pH,
2d690 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43   zSym);.  OSTRAC
2d6a0 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65  E(("DLSYM handle
2d6b0 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20  =%p, symbol=%s, 
2d6c0 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20  address=%p\n",. 
2d6d0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
2d6e0 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64  )pH, zSym, (void
2d6f0 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75  *)proc));.  retu
2d700 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
2d710 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63  ))proc;.}.static
2d720 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65   void winDlClose
2d730 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2d740 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
2d750 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
2d760 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2d770 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48  osFreeLibrary((H
2d780 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a  ANDLE)pHandle);.
2d790 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c    OSTRACE(("DLCL
2d7a0 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  OSE handle=%p\n"
2d7b0 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65  , (void*)pHandle
2d7c0 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  ));.}.#else /* i
2d7d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2d7e0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
2d7f0 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
2d800 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20  efine winDlOpen 
2d810 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
2d820 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
2d830 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30  ine winDlSym   0
2d840 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
2d850 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
2d860 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61  /* State informa
2d870 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 61 6e  tion for the ran
2d880 64 6f 6d 6e 65 73 73 20 67 61 74 68 65 72 65 72  domness gatherer
2d890 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  . */.typedef str
2d8a0 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65  uct EntropyGathe
2d8b0 72 65 72 20 45 6e 74 72 6f 70 79 47 61 74 68 65  rer EntropyGathe
2d8c0 72 65 72 3b 0a 73 74 72 75 63 74 20 45 6e 74 72  rer;.struct Entr
2d8d0 6f 70 79 47 61 74 68 65 72 65 72 20 7b 0a 20 20  opyGatherer {.  
2d8e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2d8f0 3b 20 20 20 2f 2a 20 47 61 74 68 65 72 20 65 6e  ;   /* Gather en
2d900 74 72 6f 70 79 20 69 6e 74 6f 20 74 68 69 73 20  tropy into this 
2d910 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
2d920 6e 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  na;             
2d930 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20 69  /* Size of a[] i
2d940 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
2d950 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
2d960 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69 6e 70   /* XOR next inp
2d970 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a 2f 0a  ut into a[i] */.
2d980 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20 20 20    int nXor;     
2d990 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d9a0 6f 66 20 58 4f 52 20 6f 70 65 72 61 74 69 6f 6e  of XOR operation
2d9b0 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23 69  s done */.};..#i
2d9c0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2d9d0 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
2d9e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2d9f0 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a 20 4d  RANDOMNESS)./* M
2da00 69 78 20 73 7a 20 62 79 74 65 73 20 6f 66 20 65  ix sz bytes of e
2da10 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e 20 2a  ntropy into p. *
2da20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 6f  /.static void xo
2da30 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70 79 47  rMemory(EntropyG
2da40 61 74 68 65 72 65 72 20 2a 70 2c 20 75 6e 73 69  atherer *p, unsi
2da50 67 6e 65 64 20 63 68 61 72 20 2a 78 2c 20 69 6e  gned char *x, in
2da60 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20  t sz){.  int j, 
2da70 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6b 3d  k;.  for(j=0, k=
2da80 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29  p->i; j<sz; j++)
2da90 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b 5d 20  {.    p->a[k++] 
2daa0 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  ^= x[j];.    if(
2dab0 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20 3d 20   k>=p->na ) k = 
2dac0 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20 3d 20  0;.  }.  p->i = 
2dad0 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b 3d 20  k;.  p->nXor += 
2dae0 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  sz;.}.#endif /* 
2daf0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2db00 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65  TEST) && !define
2db10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41  d(SQLITE_OMIT_RA
2db20 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a 2f 2a  NDOMNESS) */../*
2db30 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
2db40 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
2db50 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
2db60 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
2db70 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
2db80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2db90 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2dba0 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20 64 65  r *zBuf){.#if de
2dbb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2dbc0 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
2dbd0 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d  LITE_OMIT_RANDOM
2dbe0 4e 45 53 53 29 0a 20 20 55 4e 55 53 45 44 5f 50  NESS).  UNUSED_P
2dbf0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2dc00 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
2dc10 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65 74 75 72  , nBuf);.  retur
2dc20 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a 20 20  n nBuf;.#else.  
2dc30 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20  EntropyGatherer 
2dc40 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  e;.  UNUSED_PARA
2dc50 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d  METER(pVfs);.  m
2dc60 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
2dc70 42 75 66 29 3b 0a 20 20 65 2e 61 20 3d 20 28 75  Buf);.  e.a = (u
2dc80 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42  nsigned char*)zB
2dc90 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e 42 75  uf;.  e.na = nBu
2dca0 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d 20 30 3b  f;.  e.nXor = 0;
2dcb0 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20 20 7b 0a  .  e.i = 0;.  {.
2dcc0 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
2dcd0 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
2dce0 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 78  mTime(&x);.    x
2dcf0 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e  orMemory(&e, (un
2dd00 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 78 2c  signed char*)&x,
2dd10 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
2dd20 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20  ME));.  }.  {.  
2dd30 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73    DWORD pid = os
2dd40 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
2dd50 73 49 64 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65  sId();.    xorMe
2dd60 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e  mory(&e, (unsign
2dd70 65 64 20 63 68 61 72 2a 29 26 70 69 64 2c 20 73  ed char*)&pid, s
2dd80 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20  izeof(DWORD));. 
2dd90 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
2dda0 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 55  _WINRT.  {.    U
2ddb0 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f  LONGLONG cnt = o
2ddc0 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28  sGetTickCount64(
2ddd0 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79  );.    xorMemory
2dde0 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  (&e, (unsigned c
2ddf0 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f  har*)&cnt, sizeo
2de00 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29 3b 0a 20  f(ULONGLONG));. 
2de10 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20   }.#else.  {.   
2de20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47   DWORD cnt = osG
2de30 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20  etTickCount();. 
2de40 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c     xorMemory(&e,
2de50 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2de60 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 44 57  )&cnt, sizeof(DW
2de70 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ORD));.  }.#endi
2de80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
2de90 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  INRT */.  {.    
2dea0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b  LARGE_INTEGER i;
2deb0 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66  .    osQueryPerf
2dec0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26  ormanceCounter(&
2ded0 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  i);.    xorMemor
2dee0 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2def0 63 68 61 72 2a 29 26 69 2c 20 73 69 7a 65 6f 66  char*)&i, sizeof
2df00 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 29  (LARGE_INTEGER))
2df10 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54  ;.  }.#if !SQLIT
2df20 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
2df30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2df40 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55  & SQLITE_WIN32_U
2df50 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20 20 20 20  SE_UUID.  {.    
2df60 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d 65 6d  UUID id;.    mem
2df70 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65  set(&id, 0, size
2df80 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f  of(UUID));.    o
2df90 73 55 75 69 64 43 72 65 61 74 65 28 26 69 64 29  sUuidCreate(&id)
2dfa0 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2dfb0 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2dfc0 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66 28  ar*)&id, sizeof(
2dfd0 55 55 49 44 29 29 3b 0a 20 20 20 20 6d 65 6d 73  UUID));.    mems
2dfe0 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&id, 0, sizeo
2dff0 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f 73  f(UUID));.    os
2e000 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
2e010 74 69 61 6c 28 26 69 64 29 3b 0a 20 20 20 20 78  tial(&id);.    x
2e020 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e  orMemory(&e, (un
2e030 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 64  signed char*)&id
2e040 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2e050 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
2e060 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
2e070 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
2e080 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
2e090 4e 33 32 5f 55 53 45 5f 55 55 49 44 20 2a 2f 0a  N32_USE_UUID */.
2e0a0 20 20 72 65 74 75 72 6e 20 65 2e 6e 58 6f 72 3e    return e.nXor>
2e0b0 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a 20 65 2e  nBuf ? nBuf : e.
2e0c0 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  nXor;.#endif /* 
2e0d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2e0e0 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
2e0f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
2e100 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a 0a 0a 2f  OMNESS) */.}.../
2e110 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
2e120 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
2e130 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
2e140 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
2e150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2e160 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
2e170 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
2e180 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69  icrosec){.  sqli
2e190 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
2e1a0 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
2e1b0 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
2e1c0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2e1d0 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
2e1e0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
2e1f0 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
2e200 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2e210 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
2e220 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
2e230 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
2e240 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
2e250 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
2e260 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
2e270 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
2e280 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
2e290 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
2e2a0 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
2e2b0 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
2e2c0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
2e2d0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2e2e0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
2e2f0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
2e300 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2e310 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
2e320 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2e330 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2e340 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2e350 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2e360 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
2e370 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2e380 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2e390 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2e3a0 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
2e3b0 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
2e3c0 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
2e3d0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
2e3e0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
2e3f0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
2e400 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
2e410 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
2e420 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
2e430 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
2e440 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
2e450 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
2e460 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
2e470 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
2e480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e490 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
2e4a0 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
2e4b0 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a 20  ime and date.** 
2e4c0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
2e4d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2e4e0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2e4f0 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
2e500 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
2e510 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
2e520 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
2e530 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
2e540 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
2e550 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
2e560 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73  f.     100-nanos
2e570 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
2e580 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
2e590 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
2e5a0 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20 46  813.5)..  */.  F
2e5b0 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74  ILETIME ft;.  st
2e5c0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2e5d0 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65  e3_int64 winFile
2e5e0 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35  timeEpoch = 2305
2e5f0 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  8135*(sqlite3_in
2e600 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
2e610 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2e620 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2e630 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
2e640 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
2e650 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
2e660 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66  )8640000;.#endif
2e670 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20  .  /* 2^32 - to 
2e680 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20  avoid use of LL 
2e690 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20  and warnings in 
2e6a0 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  gcc */.  static 
2e6b0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2e6c0 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75  t64 max32BitValu
2e6d0 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c 69 74  e =.      (sqlit
2e6e0 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
2e6f0 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
2e700 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
2e710 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  +.      (sqlite3
2e720 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36  _int64)294967296
2e730 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
2e740 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54  _WINCE.  SYSTEMT
2e750 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65  IME time;.  osGe
2e760 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d  tSystemTime(&tim
2e770 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74  e);.  /* if Syst
2e780 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
2e790 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74  () fails, it ret
2e7a0 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  urns zero. */.  
2e7b0 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d  if (!osSystemTim
2e7c0 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
2e7d0 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74  e,&ft)){.    ret
2e7e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2e7f0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73  ;.  }.#else.  os
2e800 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
2e810 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
2e820 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77  #endif..  *piNow
2e830 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70   = winFiletimeEp
2e840 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20  och +.          
2e850 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e    ((((sqlite3_in
2e860 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74  t64)ft.dwHighDat
2e870 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56  eTime)*max32BitV
2e880 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20 20 20  alue) +.        
2e890 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2e8a0 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61  int64)ft.dwLowDa
2e8b0 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33  teTime)/(sqlite3
2e8c0 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23  _int64)10000;..#
2e8d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2e8e0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
2e8f0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
2e900 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
2e910 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2e920 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
2e930 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
2e940 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
2e950 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2e960 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
2e970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2e980 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2e990 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2e9a0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2e9b0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2e9c0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
2e9d0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2e9e0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2e9f0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
2ea00 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
2ea10 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
2ea20 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2ea30 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
2ea40 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2ea50 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2ea60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2ea70 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
2ea80 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
2ea90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
2eaa0 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
2eab0 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
2eac0 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
2ead0 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
2eae0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
2eaf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2eb00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
2eb10 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
2eb20 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
2eb30 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
2eb40 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
2eb50 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
2eb60 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e  Message() on Win
2eb70 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
2eb80 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
2eb90 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74  () on Unix). Aft
2eba0 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
2ebb0 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
2ebc0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
2ebd0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
2ebe0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
2ebf0 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
2ec00 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
2ec10 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
2ec20 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
2ec30 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
2ec40 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
2ec50 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
2ec60 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
2ec70 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
2ec80 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
2ec90 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
2eca0 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
2ecb0 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
2ecc0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
2ecd0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2ece0 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
2ecf0 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
2ed00 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
2ed10 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
2ed20 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
2ed30 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
2ed40 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
2ed50 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2ed60 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
2ed70 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
2ed80 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
2ed90 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
2eda0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
2edb0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
2edc0 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
2edd0 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
2ede0 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
2edf0 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
2ee00 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
2ee10 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
2ee20 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
2ee30 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
2ee40 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
2ee50 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
2ee60 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
2ee70 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
2ee80 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
2ee90 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
2eea0 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
2eeb0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2eec0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
2eed0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
2eee0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2eef0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2ef00 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
2ef10 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
2ef20 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
2ef30 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
2ef40 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
2ef50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2ef60 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
2ef70 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
2ef80 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
2ef90 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
2efa0 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
2efb0 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
2efc0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
2efd0 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
2efe0 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
2eff0 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
2f000 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
2f010 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
2f020 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2f030 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2f040 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 44 57  har *zBuf){.  DW
2f050 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73  ORD e = osGetLas
2f060 74 45 72 72 6f 72 28 29 3b 0a 20 20 55 4e 55 53  tError();.  UNUS
2f070 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2f080 73 29 3b 0a 20 20 69 66 28 20 6e 42 75 66 3e 30  s);.  if( nBuf>0
2f090 20 29 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72   ) winGetLastErr
2f0a0 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66 2c 20 7a  orMsg(e, nBuf, z
2f0b0 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  Buf);.  return e
2f0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
2f0d0 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74  alize and deinit
2f0e0 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
2f0f0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
2f100 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
2f110 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
2f120 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
2f130 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73  lite3_vfs winVfs
2f140 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f160 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2f170 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
2f180 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f  e),       /* szO
2f190 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
2f1a0 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
2f1b0 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
2f1c0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
2f1d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f1e0 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
2f1f0 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f210 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69  zName */.    &wi
2f220 6e 41 70 70 44 61 74 61 2c 20 20 20 20 20 20 20  nAppData,       
2f230 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
2f240 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20  */.    winOpen, 
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f260 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69   xOpen */.    wi
2f270 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  nDelete,        
2f280 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
2f290 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
2f2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2f2b0 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
2f2c0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
2f2d0 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50         /* xFullP
2f2e0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2f2f0 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2f300 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2f310 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
2f320 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  or,            /
2f330 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
2f340 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
2f350 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
2f360 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
2f370 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2f380 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
2f390 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73      winRandomnes
2f3a0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52  s,         /* xR
2f3b0 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20  andomness */.   
2f3c0 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20   winSleep,      
2f3d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
2f3e0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
2f3f0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20  entTime,        
2f400 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
2f410 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
2f420 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  tError,       /*
2f430 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2f440 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2f450 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20  TimeInt64,   /* 
2f460 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2f470 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
2f480 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20  ystemCall,      
2f490 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
2f4a0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
2f4b0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20  ystemCall,      
2f4c0 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
2f4d0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
2f4e0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2f4f0 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61  /* xNextSystemCa
2f500 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64  ll */.  };.#if d
2f510 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2f520 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2f530 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
2f540 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66  fs winLongPathVf
2f550 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
2f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f570 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
2f580 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
2f590 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a  le),       /* sz
2f5a0 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
2f5b0 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
2f5c0 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
2f5d0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2f5e0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2f5f0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
2f600 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f  */.    "win32-lo
2f610 6e 67 70 61 74 68 22 2c 20 20 20 20 20 20 2f 2a  ngpath",      /*
2f620 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77   zName */.    &w
2f630 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20 20 20  inAppData,      
2f640 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2f650 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f670 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2f680 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2f690 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2f6a0 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2f6b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2f6c0 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
2f6d0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2f6e0 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  ,       /* xFull
2f6f0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2f700 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2f710 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
2f720 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
2f730 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
2f740 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
2f750 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
2f760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f770 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2f780 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2f790 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2f7a0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2f7b0 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ss,         /* x
2f7c0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2f7d0 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2f7f0 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2f800 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20  rentTime,       
2f810 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2f820 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
2f830 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  stError,       /
2f840 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2f850 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2f860 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a  tTimeInt64,   /*
2f870 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
2f880 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
2f890 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2f8a0 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
2f8b0 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
2f8c0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2f8d0 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2f8e0 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2f8f0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f900 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2f910 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64  all */.  };.#end
2f920 69 66 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  if.  static sqli
2f930 74 65 33 5f 76 66 73 20 77 69 6e 4e 6f 6c 6f 63  te3_vfs winNoloc
2f940 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  kVfs = {.    3, 
2f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f960 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2f970 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2f980 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a  nFile),       /*
2f990 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2f9a0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2f9b0 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2f9c0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2f9d0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2f9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2f9f0 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2fa00 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20  -none",         
2fa10 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
2fa20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61   &winNolockAppDa
2fa30 74 61 2c 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ta,     /* pAppD
2fa40 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2fa50 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2fa60 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2fa70 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2fa80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2fa90 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2faa0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2fab0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2fac0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2fad0 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46  ame,       /* xF
2fae0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2faf0 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2fb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2fb10 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2fb20 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2fb30 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2fb40 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb60 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
2fb70 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
2fb80 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2fb90 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2fba0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  mness,         /
2fbb0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2fbc0 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2fbe0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2fbf0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2fc00 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2fc10 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2fc20 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2fc30 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2fc40 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2fc50 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20  rentTimeInt64,  
2fc60 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2fc70 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2fc80 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2fc90 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2fca0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2fcb0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2fcc0 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
2fcd0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2fce0 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
2fcf0 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
2fd00 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2fd10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2fd20 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2fd30 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  ).  static sqlit
2fd40 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61  e3_vfs winLongPa
2fd50 74 68 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a  thNolockVfs = {.
2fd60 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
2fd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
2fd80 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
2fd90 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
2fda0 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2fdb0 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2fdc0 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59  INNT_MAX_PATH_BY
2fdd0 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2fde0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe00 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
2fe10 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68   "win32-longpath
2fe20 2d 6e 6f 6e 65 22 2c 20 2f 2a 20 7a 4e 61 6d 65  -none", /* zName
2fe30 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f 6c 6f   */.    &winNolo
2fe40 63 6b 41 70 70 44 61 74 61 2c 20 20 20 20 20 2f  ckAppData,     /
2fe50 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
2fe60 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
2fe70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
2fe80 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
2fe90 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2fea0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
2feb0 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
2fec0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2fed0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
2fee0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
2fef0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
2ff00 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
2ff10 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2ff20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2ff30 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2ff40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2ff50 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2ff60 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
2ff70 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
2ff80 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ffa0 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
2ffb0 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
2ffc0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
2ffd0 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
2ffe0 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
2fff0 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
30000 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
30010 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43  me,        /* xC
30020 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
30030 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
30040 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74  r,       /* xGet
30050 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
30060 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
30070 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72  nt64,   /* xCurr
30080 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
30090 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
300a0 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53  Call,      /* xS
300b0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
300c0 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
300d0 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47  Call,      /* xG
300e0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
300f0 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
30100 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e  mCall,     /* xN
30110 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
30120 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  .  };.#endif..  
30130 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20  /* Double-check 
30140 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c  that the aSyscal
30150 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65  l[] array has be
30160 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  en constructed. 
30170 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20   ** correctly.  
30180 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61  See ticket [bb3a
30190 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a  86e890c8e96ab] *
301a0 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  /.  assert( Arra
301b0 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d  ySize(aSyscall)=
301c0 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74  =80 );..  /* get
301d0 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
301e0 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
301f0 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
30200 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
30210 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
30220 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  O));.#if SQLITE_
30230 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74  OS_WINRT.  osGet
30240 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
30250 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
30260 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
30270 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
30280 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  fo);.#endif.  as
30290 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f  sert( winSysInfo
302a0 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
302b0 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20  nularity>0 );.  
302c0 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
302d0 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20  fo.dwPageSize>0 
302e0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  );..  sqlite3_vf
302f0 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56  s_register(&winV
30300 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66  fs, 1);..#if def
30310 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
30320 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71  2_HAS_WIDE).  sq
30330 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
30340 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56  er(&winLongPathV
30350 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  fs, 0);.#endif..
30360 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
30370 67 69 73 74 65 72 28 26 77 69 6e 4e 6f 6c 6f 63  gister(&winNoloc
30380 6b 56 66 73 2c 20 30 29 3b 0a 0a 23 69 66 20 64  kVfs, 0);..#if d
30390 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
303a0 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
303b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
303c0 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74  ster(&winLongPat
303d0 68 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30 29 3b 0a  hNolockVfs, 0);.
303e0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
303f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
30400 20 20 77 69 6e 42 69 67 4c 6f 63 6b 20 3d 20 73    winBigLock = s
30410 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
30420 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
30430 41 54 49 43 5f 56 46 53 31 29 3b 0a 23 65 6e 64  ATIC_VFS1);.#end
30440 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
30450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
30460 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
30470 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  id){.#if SQLITE_
30480 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
30490 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b  leepObj!=NULL ){
304a0 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
304b0 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20  le(sleepObj);.  
304c0 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c    sleepObj = NUL
304d0 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  L;.  }.#endif..#
304e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
304f0 49 54 5f 57 41 4c 0a 20 20 77 69 6e 42 69 67 4c  IT_WAL.  winBigL
30500 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ock = 0;.#endif.
30510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30520 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
30530 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  * SQLITE_OS_WIN 
30540 2a 2f 0a                                         */.