/ Hex Artifact Content
Login

Artifact eac2f14343eaf9ff8c02d7025ce459f64dc1334c1f6739be5b6595aabed32ca2:


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 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2730: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2740: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
2750: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
2760: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74   that. * the dat
2770: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  a directory shou
2780: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
2790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
27a0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
27b0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
27c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
27d0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
27e0: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69  Y_TYPE (1).#endi
27f0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2800: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2810: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
2820: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
2830: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
2840: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
2850: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
2860: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
2870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2880: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
2890: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
28a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
28b0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
28c0: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (2).#endif../*.
28d0: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77   * If compiled w
28e0: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ith SQLITE_WIN32
28f0: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f  _MALLOC on Windo
2900: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20  ws, we will use 
2910: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57  the. * various W
2920: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75  in32 API heap fu
2930: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20  nctions instead 
2940: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a  of our own.. */.
2950: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2960: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20  N32_MALLOC../*. 
2970: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e  * If this is non
2980: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74  -zero, an isolat
2990: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
29a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  created by the n
29b0: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61  ative Win32. * a
29c0: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74  llocator subsyst
29d0: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  em; otherwise, t
29e0: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65  he default proce
29f0: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ss heap will be 
2a00: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73  used.  This. * s
2a10: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66  etting has no ef
2a20: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  fect when compil
2a30: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20  ing for WinRT.  
2a40: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
2a50: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61   is enabled. * a
2a60: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  nd an isolated h
2a70: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
2a80: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c  ted to store all
2a90: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e   allocated data.
2aa0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . *. ***********
2ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad0: 2a 2a 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 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20  ***. * WARNING: 
2b00: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2b10: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65  to note that whe
2b20: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69  n this setting i
2b30: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2b40: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77  he. *          w
2b50: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75  inMemShutdown fu
2b60: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2b70: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71   (e.g. by the sq
2b80: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
2b90: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74  *          funct
2ba0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74  ion), all data t
2bb0: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  hat was allocate
2bc0: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c  d using the isol
2bd0: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20  ated heap will. 
2be0: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72  *          be fr
2bf0: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  eed immediately 
2c00: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20  and any attempt 
2c10: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66  to access any of
2c20: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20   that freed. *  
2c30: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c          data wil
2c40: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  l almost certain
2c50: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
2c60: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73  immediate access
2c70: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a   violation.. ***
2c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a  ***********. */.
2cd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2ce0: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
2cf0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2d00: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2d10: 41 54 45 20 20 20 20 20 20 20 20 28 54 52 55 45  ATE        (TRUE
2d20: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2d30: 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 78 69  This is the maxi
2d40: 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 69 6e 69  mum possible ini
2d50: 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tial size of the
2d60: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20   Win32-specific 
2d70: 68 65 61 70 2c 20 69 6e 0a 20 2a 20 62 79 74 65  heap, in. * byte
2d80: 73 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  s.. */.#ifndef S
2d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2da0: 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  _MAX_INIT_SIZE.#
2db0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2dc0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49  WIN32_HEAP_MAX_I
2dd0: 4e 49 54 5f 53 49 5a 45 20 28 34 32 39 34 39 36  NIT_SIZE (429496
2de0: 37 32 39 35 55 29 0a 23 65 6e 64 69 66 0a 0a 2f  7295U).#endif../
2df0: 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74 68 65  *. * This is the
2e00: 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f 72   extra space for
2e10: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   the initial siz
2e20: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
2e30: 70 65 63 69 66 69 63 20 68 65 61 70 2c 0a 20 2a  pecific heap,. *
2e40: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
2e50: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
2e60: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
2e70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2e80: 50 5f 49 4e 49 54 5f 45 58 54 52 41 0a 23 20 20  P_INIT_EXTRA.#  
2e90: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2ea0: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45 58  N32_HEAP_INIT_EX
2eb0: 54 52 41 20 20 28 34 31 39 34 33 30 34 29 0a 23  TRA  (4194304).#
2ec0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 43 61 6c  endif../*. * Cal
2ed0: 63 75 6c 61 74 65 20 74 68 65 20 6d 61 78 69 6d  culate the maxim
2ee0: 75 6d 20 6c 65 67 61 6c 20 63 61 63 68 65 20 73  um legal cache s
2ef0: 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 62  ize, in pages, b
2f00: 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 78 69  ased on the maxi
2f10: 6d 75 6d 0a 20 2a 20 70 6f 73 73 69 62 6c 65 20  mum. * possible 
2f20: 69 6e 69 74 69 61 6c 20 68 65 61 70 20 73 69 7a  initial heap siz
2f30: 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c  e and the defaul
2f40: 74 20 70 61 67 65 20 73 69 7a 65 2c 20 73 65 74  t page size, set
2f50: 74 69 6e 67 20 61 73 69 64 65 20 74 68 65 0a 20  ting aside the. 
2f60: 2a 20 6e 65 65 64 65 64 20 65 78 74 72 61 20 73  * needed extra s
2f70: 70 61 63 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  pace.. */.#ifnde
2f80: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
2f90: 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  AX_CACHE_SIZE.# 
2fa0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2fb0: 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f 53  IN32_MAX_CACHE_S
2fc0: 49 5a 45 20 20 20 28 28 28 53 51 4c 49 54 45 5f  IZE   (((SQLITE_
2fd0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49  WIN32_HEAP_MAX_I
2fe0: 4e 49 54 5f 53 49 5a 45 29 20 2d 20 5c 0a 20 20  NIT_SIZE) - \.  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
3020: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
3030: 45 58 54 52 41 29 29 20 2f 20 5c 0a 20 20 20 20  EXTRA)) / \.    
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46       (SQLITE_DEF
3070: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 29  AULT_PAGE_SIZE))
3080: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
3090: 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a  his is cache siz
30a0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61  e used in the ca
30b0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  lculation of the
30c0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
30d0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70   the. * Win32-sp
30e0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74  ecific heap.  It
30f0: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74   cannot be negat
3100: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ive.. */.#ifndef
3110: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41   SQLITE_WIN32_CA
3120: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53  CHE_SIZE.#  if S
3130: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
3140: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20  CHE_SIZE>=0.#   
3150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3160: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
3170: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
3180: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 0a  ULT_CACHE_SIZE).
3190: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
31a0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
31b0: 5f 43 41 43 48 45 5f 53 49 5a 45 20 20 20 20 20  _CACHE_SIZE     
31c0: 28 2d 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  (-(SQLITE_DEFAUL
31d0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 29 0a 23  T_CACHE_SIZE)).#
31e0: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
31f0: 2f 2a 0a 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*. * Make sure 
3200: 74 68 61 74 20 74 68 65 20 63 61 6c 63 75 6c 61  that the calcula
3210: 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 2c 20  ted cache size, 
3220: 69 6e 20 70 61 67 65 73 2c 20 63 61 6e 6e 6f 74  in pages, cannot
3230: 20 63 61 75 73 65 20 74 68 65 0a 20 2a 20 69 6e   cause the. * in
3240: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
3250: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
3260: 20 68 65 61 70 20 74 6f 20 65 78 63 65 65 64 20   heap to exceed 
3270: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
3280: 6e 74 0a 20 2a 20 6f 66 20 6d 65 6d 6f 72 79 20  nt. * of memory 
3290: 74 68 61 74 20 63 61 6e 20 62 65 20 73 70 65 63  that can be spec
32a0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61 6c  ified in the cal
32b0: 6c 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 2e  l to HeapCreate.
32c0: 0a 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
32d0: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
32e0: 3e 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  >SQLITE_WIN32_MA
32f0: 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20 20  X_CACHE_SIZE.#  
3300: 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  undef SQLITE_WIN
3310: 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  32_CACHE_SIZE.# 
3320: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3330: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
3340: 20 20 20 20 20 20 28 32 30 30 30 29 0a 23 65 6e        (2000).#en
3350: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  dif../*. * The i
3360: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
3370: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
3380: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
3390: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
33a0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
33b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
33c0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
33d0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
33e0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 20  HEAP_INIT_SIZE  
33f0: 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   ((SQLITE_WIN32_
3400: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a  CACHE_SIZE) * \.
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
3440: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
3450: 5a 45 29 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  ZE) + \.        
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48   (SQLITE_WIN32_H
3490: 45 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 29 29  EAP_INIT_EXTRA))
34a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
34b0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
34c0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
34d0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
34e0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
34f0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
3500: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
3510: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
3520: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
3530: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
3540: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
3550: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
3560: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
3570: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
3580: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
3590: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
35a0: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
35b0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
35c0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
35d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
35e0: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
35f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
3600: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 20 20 28  AP_FLAGS       (
3610: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0).#endif.../*.*
3620: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
3630: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
3640: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
3650: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
3660: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
3670: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3680: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
3690: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
36a0: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
36b0: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
36c0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
36d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
36e0: 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20    u32 magic1;   
36f0: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
3700: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
3710: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
3720: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
3730: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
3740: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
3750: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
3760: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
3770: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
3780: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
3790: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
37a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
37b0: 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f   u32 magic2;   /
37c0: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
37d0: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
37e0: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
37f0: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66  /.#endif.};..#if
3800: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
3810: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
3820: 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62  1     0x42b2830b
3830: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f  .#define WINMEM_
3840: 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34  MAGIC2     0xbd4
3850: 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74  d7cf4.#endif..st
3860: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
3870: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
3880: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
3890: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
38a0: 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20  MAGIC1,.#endif. 
38b0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66   NULL, FALSE.#if
38c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57  ndef NDEBUG.  ,W
38d0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e  INMEM_MAGIC2.#en
38e0: 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  dif.};..#ifndef 
38f0: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
3900: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3910: 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  1() assert( win_
3920: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d  mem_data.magic1=
3930: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
3940: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
3950: 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73  ssertMagic2() as
3960: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
3970: 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  ta.magic2==WINME
3980: 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69  M_MAGIC2 ).#defi
3990: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
39a0: 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73  agic()  winMemAs
39b0: 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69  sertMagic1(); wi
39c0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32  nMemAssertMagic2
39d0: 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ();.#else.#defin
39e0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
39f0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
3a00: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44  efine winMemGetD
3a10: 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d  ataPtr()  &win_m
3a20: 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20  em_data.#define 
3a30: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
3a40: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
3a50: 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77  .hHeap.#define w
3a60: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
3a70: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
3a80: 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76  bOwned..static v
3a90: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
3aa0: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
3ab0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
3ac0: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
3ad0: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
3ae0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
3af0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
3b00: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
3b10: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
3b20: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
3b30: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
3b40: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
3b50: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
3b60: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
3b70: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
3b80: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
3b90: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
3ba0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
3bb0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
3bc0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
3bd0: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
3be0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
3bf0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
3c00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
3c10: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
3c20: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
3c30: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
3c40: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
3c50: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
3c60: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
3c70: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
3c80: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
3c90: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
3ca0: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
3cb0: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
3cc0: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
3cd0: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
3ce0: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3cf0: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
3d00: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
3d10: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
3d20: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
3d30: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
3d40: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
3d50: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
3d60: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
3d70: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
3d80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3d90: 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45 5f  EST.LONG SQLITE_
3da0: 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73  WIN32_VOLATILE s
3db0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
3dc0: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
3dd0: 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e   LONG SQLITE_WIN
3de0: 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69  32_VOLATILE sqli
3df0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
3e00: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3e10: 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69   SYSCALL.#  defi
3e20: 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74  ne SYSCALL sqlit
3e30: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23  e3_syscall_ptr.#
3e40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
3e50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
3e60: 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  t available on W
3e70: 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e  indows CE or Win
3e80: 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  RT.. */..#if SQL
3e90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
3ea0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
3eb0: 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46  #  define osAreF
3ec0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20  ileApisANSI()   
3ed0: 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a      1.#endif../*
3ee0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
3ef0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
3f00: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
3f10: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
3f20: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
3f30: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
3f40: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
3f50: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
3f60: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
3f70: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
3f80: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
3f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
3fa0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
3fb0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
3fc0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
3fd0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
3fe0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
3ff0: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
4000: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
4010: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
4020: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4030: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
4040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
4050: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
4060: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
4070: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
4080: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
4090: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
40a0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
40b0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
40c0: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66  yscall[] = {.#if
40d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
40e0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
40f0: 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69  WINRT.  { "AreFi
4100: 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20  leApisANSI",    
4110: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72       (SYSCALL)Ar
4120: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20  eFileApisANSI,  
4130: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4140: 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  e.  { "AreFileAp
4150: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
4160: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4190: 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c  #ifndef osAreFil
41a0: 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e  eApisANSI.#defin
41b0: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  e osAreFileApisA
41c0: 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  NSI ((BOOL(WINAP
41d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
41e0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
41f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
4200: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4210: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4220: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4230: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20  { "CharLowerW", 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4250: 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57  SCALL)CharLowerW
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
4270: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
4280: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
4290: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
42a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
42b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
42c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
42d0: 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c  osCharLowerW ((L
42e0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
42f0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
4300: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4310: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4320: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
4330: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4340: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70  DE).  { "CharUpp
4350: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
4360: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
4370: 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20  UpperW,         
4380: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4390: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
43a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
43b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
43e0: 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65  efine osCharUppe
43f0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
4400: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
4410: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
4420: 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61  t)..  { "CloseHa
4430: 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  ndle",          
4440: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73     (SYSCALL)Clos
4450: 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  eHandle,        
4460: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4470: 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ne osCloseHandle
4480: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4490: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
44a0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
44b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
44c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
44d0: 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  I).  { "CreateFi
44e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
44f0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
4500: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
4510: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4520: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
4530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4540: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4570: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
4580: 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  eA ((HANDLE(WINA
4590: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
45a0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
45b0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
45c0: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
45d0: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
45e0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
45f0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4600: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4610: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4620: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4630: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20  CreateFileW",   
4640: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4650: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20  LL)CreateFileW, 
4660: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4670: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
4680: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
46c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
46d0: 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e  reateFileW ((HAN
46e0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
46f0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
4700: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
4710: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4720: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
4730: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
4740: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4750: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4760: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
4770: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4780: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
4790: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
47a0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
47b0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
47c0: 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20 20  IZE>0) && \.    
47d0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
47e0: 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49  _CREATEFILEMAPPI
47f0: 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NGA.  { "CreateF
4800: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
4810: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
4820: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20  teFileMappingA, 
4830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4840: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
4850: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
4860: 53 59 53 43 41 4c 4c 29 30 2c 20 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4890: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
48a0: 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e  leMappingA ((HAN
48b0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
48c0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
48d0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
48e0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
48f0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61  ,DWORD,LPCSTR))a
4900: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
4910: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4920: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
4930: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4940: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4950: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4960: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
4970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4980: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4990: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
49a0: 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  >0)).  { "Create
49b0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
49c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
49d0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
49e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
49f0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
4a00: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
4a10: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4a40: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
4a50: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
4a60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
4a70: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
4a80: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
4a90: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
4aa0: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
4ab0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
4ac0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4ad0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4ae0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4af0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4b00: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
4b10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4b20: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
4b30: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
4b40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4b50: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
4b60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4b70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4ba0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
4bb0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4bc0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
4bd0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
4be0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
4bf0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
4c00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4c30: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
4c40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c50: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
4c80: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
4c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
4cd0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
4ce0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
4cf0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
4d00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4d10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4d20: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4d30: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4d50: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
4d60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4d70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
4d80: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
4d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4da0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4dc0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4dd0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
4de0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4df0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
4e00: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4e10: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4e20: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4e30: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4e40: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4e50: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4e60: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
4e70: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
4e80: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
4e90: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4eb0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4ec0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
4ed0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
4ee0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
4ef0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
4f00: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
4f10: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
4f20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4f30: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4f40: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4f50: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4f60: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
4f70: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
4f80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4f90: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
4fa0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
4fb0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4fd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4fe0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
4ff0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
5000: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
5010: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
5020: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
5030: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
5040: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5050: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
5060: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5070: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
5080: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
5090: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
50a0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
50b0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
50c0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
50d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
50e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
50f0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
5100: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
5110: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
5120: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
5130: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
5140: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5150: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
5160: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
5170: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5190: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
51a0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
51b0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
51c0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
51d0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
51e0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
51f0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
5200: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
5210: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5230: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
5240: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
5250: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5260: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
5270: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
5280: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
5290: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
52a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
52d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
52e0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
52f0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
5300: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
5310: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
5320: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
5330: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
5340: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
5350: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
5370: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
5380: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
5390: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
53a0: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
53c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65  .#else.  { "Free
53d0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
53e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
53f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5400: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5410: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
5420: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
5430: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
5440: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
5450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5460: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
5470: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
5480: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
5490: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
54a0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
54b0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
54c0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
54d0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
54e0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
54f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5500: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
5510: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5520: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
5530: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
5540: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5550: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
5560: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
5570: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
5580: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
5590: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
55c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
55d0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
55e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
55f0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
5600: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
5610: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
5620: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
5630: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
5650: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5660: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5670: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
5680: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
5690: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
56a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
56b0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
56c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
56d0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
56e0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
56f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5720: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
5730: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
5740: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
5750: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
5760: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
5770: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
5780: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
5790: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
57a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
57b0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
57c0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
57d0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
57e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
57f0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
5800: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
5810: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
5820: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5850: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
5860: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
5870: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5880: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
5890: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
58a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
58b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
58c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
58d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
58e0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
58f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5900: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5910: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
5920: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
5930: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
5940: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5970: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5980: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
5990: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
59a0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
59b0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
59c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
59d0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
59e0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
59f0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
5a10: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5a30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
5a40: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
5a50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5a80: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
5a90: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
5aa0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
5ab0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
5ac0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
5ad0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
5ae0: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
5af0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5b00: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5b10: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
5b20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5b30: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5b50: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5b60: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
5b70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5b90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5ba0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5bb0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
5bc0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
5bd0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
5be0: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e  call[23].pCurren
5bf0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5c00: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
5c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
5c30: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5c40: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5c50: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
5c60: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
5c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5c80: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
5c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5cd0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
5ce0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5cf0: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
5d00: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
5d10: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
5d20: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
5d30: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5d40: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
5d50: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5d60: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5d70: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5d80: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
5d90: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
5da0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
5db0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
5dc0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
5dd0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
5de0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5e10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5e20: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
5e30: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5e40: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
5e50: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
5e60: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
5e70: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
5e80: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
5e90: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
5ea0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
5eb0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
5ec0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5ed0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
5ee0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5ef0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
5f00: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
5f10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5f20: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5f30: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54  NSION).#if SQLIT
5f40: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
5f50: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
5f60: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
5f70: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
5f80: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
5f90: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
5fa0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
5fb0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
5fc0: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
5fd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5fe0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
5ff0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
6000: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
6010: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
6020: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
6030: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
6040: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
6050: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
6060: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
6070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6080: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
6090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
60a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20  endif.#else.  { 
60b0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
60c0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
60d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
60f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6100: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  e osGetProcAddre
6110: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49  ssA ((FARPROC(WI
6120: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20  NAPI*)(HMODULE, 
6130: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
6140: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
6150: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6160: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6170: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
6180: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
6190: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
61a0: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
61b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
61c0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
61d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
61e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6200: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6210: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
6220: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6230: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  (LPSYSTEM_INFO))
6240: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
6250: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
6260: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
6270: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6280: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  GetSystemTime,  
6290: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
62a0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
62b0: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  emTime ((VOID(WI
62c0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54  NAPI*)(LPSYSTEMT
62d0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39  IME))aSyscall[29
62e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
62f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
6300: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  E.  { "GetSystem
6310: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
6320: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
6330: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
6340: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
6350: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
6360: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
6370: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6390: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
63a0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
63b0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28  imeAsFileTime ((
63c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
63d0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
63e0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30  IME))aSyscall[30
63f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6400: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6410: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
6420: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
6430: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
6440: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
6450: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20  athA,           
6460: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6470: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
6480: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6490: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
64b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
64c0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  e osGetTempPathA
64d0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
64e0: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61  )(DWORD,LPSTR))a
64f0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
6500: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6510: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
6520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6530: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
6540: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
6550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6560: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
6570: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hW,            0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
6590: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
65e0: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28  osGetTempPathW (
65f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6600: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53  DWORD,LPWSTR))aS
6610: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72  yscall[32].pCurr
6620: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6630: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6640: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
6650: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6660: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c  LL)GetTickCount,
6670: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6680: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
6690: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
66a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
66b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
66d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
66e0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
66f0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
6700: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
6710: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6720: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6730: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
6740: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
6750: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22  TVERSIONEX.  { "
6760: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
6770: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6780: 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41  LL)GetVersionExA
6790: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
67a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56  .#else.  { "GetV
67b0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
67d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
67f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
6800: 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42  etVersionExA ((B
6810: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
6820: 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53          LPOSVERS
6830: 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61  IONINFOA))aSysca
6840: 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[34].pCurrent)
6850: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6860: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
6870: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6880: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
6890: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
68a0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
68b0: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
68c0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xW",           (
68d0: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
68e0: 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20 20  onExW,          
68f0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6900: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
6910: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6920: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6940: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6950: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
6960: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
6970: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
6980: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61  SVERSIONINFOW))a
6990: 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72  Syscall[35].pCur
69a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
69b0: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
69c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
69d0: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
69e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
69f0: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
6a00: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
6a10: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6a20: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6a30: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d  _T))aSyscall[36]
6a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6a50: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6a60: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
6a70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6a80: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
6a90: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ab0: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b00: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
6b10: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6b20: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
6b30: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6b40: 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70  ))aSyscall[37].p
6b50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6b70: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
6b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6b90: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
6ba0: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
6bb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6bc0: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
6bd0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6be0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6c00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6c10: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
6c20: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6c30: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
6c40: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  38].pCurrent).. 
6c50: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6c70: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6ca0: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
6cb0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6cc0: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
6cd0: 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72  yscall[39].pCurr
6ce0: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
6cf0: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
6d00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6d10: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
6d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6d30: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
6d40: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
6d50: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6d60: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
6d70: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6d80: 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e  call[40].pCurren
6d90: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
6da0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6dc0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
6dd0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6de0: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
6df0: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
6e00: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6e10: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
6e20: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43  )aSyscall[41].pC
6e30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6e40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6e50: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
6e60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6e70: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
6e80: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
6e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6ea0: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
6eb0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6ef0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
6f00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6f10: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
6f20: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
6f30: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75  aSyscall[42].pCu
6f40: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6f50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
6f60: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6f70: 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63  .  { "HeapCompac
6f80: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
6f90: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d  (SYSCALL)HeapCom
6fa0: 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  pact,           
6fb0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6fc0: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6fe0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7000: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7010: 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63 74  ne osHeapCompact
7020: 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a 29   ((UINT(WINAPI*)
7030: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61  (HANDLE,DWORD))a
7040: 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72  Syscall[43].pCur
7050: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
7060: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
7070: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
7080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7090: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
70a0: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  ).  { "LoadLibra
70b0: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
70c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69   (SYSCALL)LoadLi
70d0: 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20  braryA,         
70e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
70f0: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
7100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7110: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7130: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7140: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  ine osLoadLibrar
7150: 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  yA ((HMODULE(WIN
7160: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
7170: 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72  yscall[44].pCurr
7180: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7190: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
71a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
71b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
71c0: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
71d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
71e0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
71f0: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
7200: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
7210: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
7220: 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryW,            
7230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7240: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
7250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7290: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20   osLoadLibraryW 
72a0: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
72b0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
72c0: 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e  call[45].pCurren
72d0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
72e0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
72f0: 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20  calFree",       
7300: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7310: 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20  )LocalFree,     
7320: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7330: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  else.  { "LocalF
7340: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
7350: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7380: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  f..#define osLoc
7390: 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28  alFree ((HLOCAL(
73a0: 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29  WINAPI*)(HLOCAL)
73b0: 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43  )aSyscall[46].pC
73c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
73d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
73e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
73f0: 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  T.  { "LockFile"
7400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7410: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
7420: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
7430: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7440: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7460: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7480: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
7490: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23  def osLockFile.#
74a0: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
74b0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
74c0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
74d0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
74e0: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
74f0: 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65  scall[47].pCurre
7500: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7510: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7520: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78  .  { "LockFileEx
7530: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7540: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c  (SYSCALL)LockFil
7550: 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  eEx,            
7560: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7570: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
7580: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7590: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
75b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
75c0: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a  ef osLockFileEx.
75d0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
75e0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
75f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7600: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  D,DWORD,DWORD,DW
7610: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7620: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7630: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
7640: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7650: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7660: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
7670: 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20  INRT && \.      
7680: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
7690: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
76a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
76b0: 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d 61  SIZE>0)).  { "Ma
76c0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
76d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
76e0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  )MapViewOfFile, 
76f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7700: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
7710: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
7720: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7750: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
7760: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56  ViewOfFile ((LPV
7770: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
7780: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
7790: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
77a0: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
77b0: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
77c0: 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54  .  { "MultiByteT
77d0: 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20  oWideChar",     
77e0: 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79  (SYSCALL)MultiBy
77f0: 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20  teToWideChar,   
7800: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7810: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7820: 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41  eChar ((int(WINA
7830: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
7840: 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54  LPCSTR,int,LPWST
7850: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74  R, \.        int
7860: 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70  ))aSyscall[50].p
7870: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51  Current)..  { "Q
7880: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
7890: 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c  ounter", (SYSCAL
78a0: 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  L)QueryPerforman
78b0: 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a  ceCounter, 0 },.
78c0: 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79  .#define osQuery
78d0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
78e0: 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  er ((BOOL(WINAPI
78f0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41  *)( \.        LA
7900: 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53  RGE_INTEGER*))aS
7910: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72  yscall[51].pCurr
7920: 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46  ent)..  { "ReadF
7930: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7940: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65       (SYSCALL)Re
7950: 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  adFile,         
7960: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7970: 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20  fine osReadFile 
7980: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7990: 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57  HANDLE,LPVOID,DW
79a0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
79b0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
79c0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32  PED))aSyscall[52
79d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
79e0: 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c   "SetEndOfFile",
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7a00: 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c  CALL)SetEndOfFil
7a10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
7a20: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  },..#define osSe
7a30: 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f  tEndOfFile ((BOO
7a40: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7a50: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e  E))aSyscall[53].
7a60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7a70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7a80: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7a90: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
7aa0: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
7ab0: 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20  ointer,         
7ac0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7ad0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
7ae0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7af0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7b10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7b20: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
7b30: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  er ((DWORD(WINAP
7b40: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c  I*)(HANDLE,LONG,
7b50: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20  PLONG, \.       
7b60: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
7b70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [54].pCurrent)..
7b80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7b90: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22  INRT.  { "Sleep"
7ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7bb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65      (SYSCALL)Sle
7bc0: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
7bd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7be0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7c30: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28  define osSleep (
7c40: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44  (VOID(WINAPI*)(D
7c50: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
7c60: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
7c70: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  { "SystemTimeToF
7c80: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59  ileTime",    (SY
7c90: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65  SCALL)SystemTime
7ca0: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30  ToFileTime,    0
7cb0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
7cc0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7cd0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
7ce0: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d  I*)(CONST SYSTEM
7cf0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
7d00: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
7d10: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
7d20: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7d30: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
7d40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7d50: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7d70: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
7d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
7d90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
7da0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
7db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7dc0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7de0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
7df0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65  osUnlockFile.#de
7e00: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
7e10: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
7e20: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
7e30: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7e40: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
7e50: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65  scall[57].pCurre
7e60: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7e70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7e80: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7e90: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
7ea0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
7eb0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
7ec0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7ed0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7ef0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7f10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7f20: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  ne osUnlockFileE
7f30: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7f40: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
7f50: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7f60: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
7f70: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d  ED))aSyscall[58]
7f80: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7f90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7fa0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
7fb0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
7fc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
7fd0: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d 61  SIZE>0.  { "Unma
7fe0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
7ff0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
8000: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  nmapViewOfFile, 
8010: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8020: 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  se.  { "UnmapVie
8030: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
8040: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8070: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70  .#define osUnmap
8080: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f  ViewOfFile ((BOO
8090: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f  L(WINAPI*)(LPCVO
80a0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d  ID))aSyscall[59]
80b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
80c0: 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  "WideCharToMulti
80d0: 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43  Byte",     (SYSC
80e0: 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75  ALL)WideCharToMu
80f0: 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d  ltiByte,     0 }
8100: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64  ,..#define osWid
8110: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
8120: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
8130: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53  UINT,DWORD,LPCWS
8140: 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74  TR,int,LPSTR,int
8150: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
8160: 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63  TR,LPBOOL))aSysc
8170: 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74  all[60].pCurrent
8180: 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c  )..  { "WriteFil
8190: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
81a0: 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65    (SYSCALL)Write
81b0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
81c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
81d0: 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28  e osWriteFile ((
81e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
81f0: 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  NDLE,LPCVOID,DWO
8200: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
8210: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
8220: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d  ED))aSyscall[61]
8230: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8240: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
8250: 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74    { "CreateEvent
8260: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  ExW",          (
8270: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76  SYSCALL)CreateEv
8280: 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20  entExW,         
8290: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
82a0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
82b0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
82c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
82e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
82f0: 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  e osCreateEventE
8300: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
8310: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
8320: 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53  ATTRIBUTES,LPCWS
8330: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
8340: 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63  ORD,DWORD))aSysc
8350: 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74  all[62].pCurrent
8360: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
8370: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
8380: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8390: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
83a0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
83b0: 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65  ect,     0 },.#e
83c0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
83d0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
83e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8410: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
8420: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20  ForSingleObject 
8430: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
8440: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
8450: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
8460: 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[63].pCurrent)
8470: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
8480: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69 74  _WINCE.  { "Wait
8490: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
84a0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57  x",   (SYSCALL)W
84b0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
84c0: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  ctEx,   0 },.#el
84d0: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
84e0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
84f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8520: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
8530: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
8540: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
8550: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
8560: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29  \.        BOOL))
8570: 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75  aSyscall[64].pCu
8580: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8590: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
85a0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
85b0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
85c0: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
85d0: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d  erEx,        0 }
85e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
85f0: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
8600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8610: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8630: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8640: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
8650: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
8660: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
8670: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
8680: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
8690: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
86a0: 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  65].pCurrent)..#
86b0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
86c0: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  RT.  { "GetFileI
86d0: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
86e0: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
86f0: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
8700: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20  onByHandleEx, 0 
8710: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
8720: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
8730: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
8740: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8750: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8760: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8770: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
8780: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28  ionByHandleEx ((
8790: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
87a0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
87b0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e  FILE_INFO_BY_HAN
87c0: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44  DLE_CLASS,LPVOID
87d0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
87e0: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [66].pCurrent)..
87f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8800: 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65 64  NRT && (!defined
8810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
8820: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
8830: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b  MMAP_SIZE>0).  {
8840: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
8850: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
8860: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
8870: 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20  leFromApp,    0 
8880: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
8890: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
88a0: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
88b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
88c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
88d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
88e0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
88f0: 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57  omApp ((LPVOID(W
8900: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55  INAPI*)(HANDLE,U
8910: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a  LONG,ULONG64, \.
8920: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
8930: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75  aSyscall[67].pCu
8940: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8950: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8960: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
8970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
8980: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c  ALL)CreateFile2,
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
89a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
89b0: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
89c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
89d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
89e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
89f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8a00: 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41  CreateFile2 ((HA
8a10: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
8a20: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
8a30: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
8a40: 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32     LPCREATEFILE2
8a50: 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
8a60: 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36  TERS))aSyscall[6
8a70: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
8a80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8a90: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
8aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
8ab0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
8ac0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
8ad0: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
8ae0: 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  L)LoadPackagedLi
8af0: 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a  brary,     0 },.
8b00: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50  #else.  { "LoadP
8b10: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
8b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8b50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
8b60: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
8b70: 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  y ((HMODULE(WINA
8b80: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a  PI*)(LPCWSTR, \.
8b90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
8ba0: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72  Syscall[69].pCur
8bb0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8bc0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8bd0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
8be0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8bf0: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  LL)GetTickCount6
8c00: 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  4,          0 },
8c10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
8c20: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
8c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
8c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8c50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8c60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
8c70: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28  etTickCount64 ((
8c80: 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49  ULONGLONG(WINAPI
8c90: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8ca0: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[70].pCurrent).
8cb0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8cc0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74  INRT.  { "GetNat
8cd0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
8ce0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8cf0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8d00: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
8d10: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
8d20: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
8d30: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8d60: 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69  define osGetNati
8d70: 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  veSystemInfo ((V
8d80: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
8d90: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
8da0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
8db0: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  71].pCurrent)..#
8dc0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8dd0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
8de0: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8df0: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
8e00: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8e10: 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20  DebugStringA,   
8e20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8e30: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
8e40: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
8e50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8e70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8e80: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8e90: 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28  gStringA ((VOID(
8ea0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
8eb0: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
8ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
8ed0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8ee0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
8ef0: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8f00: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
8f10: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8f20: 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  tringW,      0 }
8f30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
8f40: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
8f50: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8f60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8f70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8f80: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8f90: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8fa0: 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gW ((VOID(WINAPI
8fb0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
8fc0: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e  call[73].pCurren
8fd0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  t)..  { "GetProc
8fe0: 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20  essHeap",       
8ff0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
9000: 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20  rocessHeap,     
9010: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
9020: 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48  ne osGetProcessH
9030: 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  eap ((HANDLE(WIN
9040: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
9050: 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e  call[74].pCurren
9060: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
9070: 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64 65 66  S_WINRT && (!def
9080: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9090: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
90a0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
90b0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
90c0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c  MappingFromApp",
90d0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
90e0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
90f0: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  pp, 0 },.#else. 
9100: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
9110: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
9120: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
9150: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
9160: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20  eMappingFromApp 
9170: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
9180: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
9190: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
91a0: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c  TTRIBUTES,ULONG,
91b0: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29  ULONG64,LPCWSTR)
91c0: 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43  )aSyscall[75].pC
91d0: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e  urrent)../*.** N
91e0: 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62  OTE: On some sub
91f0: 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65 20  -platforms, the 
9200: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
9210: 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e 63  reExchange "func
9220: 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69  tion".**       i
9230: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
9240: 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73 20  macro that uses 
9250: 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69  a compiler intri
9260: 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29 2e  nsic (e.g. x64).
9270: 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f 20  .**       So do 
9280: 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65 20  not try to make 
9290: 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20 72  this is into a r
92a0: 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65 72  edefinable inter
92b0: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  face..*/.#if def
92c0: 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64  ined(Interlocked
92d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29  CompareExchange)
92e0: 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65  .  { "Interlocke
92f0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9300: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
9330: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
9340: 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e 74  pareExchange Int
9350: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
9360: 78 63 68 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20  xchange.#else.  
9370: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  { "InterlockedCo
9380: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20  mpareExchange", 
9390: 28 53 59 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f  (SYSCALL)Interlo
93a0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
93b0: 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  nge, 0 },..#defi
93c0: 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64  ne osInterlocked
93d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20  CompareExchange 
93e0: 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  ((LONG(WINAPI*)(
93f0: 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20 20 20 53  LONG \.        S
9400: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
9410: 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47  TILE*, LONG,LONG
9420: 29 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70  ))aSyscall[76].p
9430: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 20  Current).#endif 
9440: 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72  /* defined(Inter
9450: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
9460: 68 61 6e 67 65 29 20 2a 2f 0a 0a 23 69 66 20 21  hange) */..#if !
9470: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
9480: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
9490: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
94a0: 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b  N32_USE_UUID.  {
94b0: 20 22 55 75 69 64 43 72 65 61 74 65 22 2c 20 20   "UuidCreate",  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
94d0: 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65  SCALL)UuidCreate
94e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
94f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75  },.#else.  { "Uu
9500: 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  idCreate",      
9510: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
9520: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
9530: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
9540: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
9550: 73 55 75 69 64 43 72 65 61 74 65 20 28 28 52 50  sUuidCreate ((RP
9560: 43 5f 53 54 41 54 55 53 28 52 50 43 5f 45 4e 54  C_STATUS(RPC_ENT
9570: 52 59 2a 29 28 55 55 49 44 2a 29 29 61 53 79 73  RY*)(UUID*))aSys
9580: 63 61 6c 6c 5b 37 37 5d 2e 70 43 75 72 72 65 6e  call[77].pCurren
9590: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
95a0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
95b0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
95c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
95d0: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43  _UUID.  { "UuidC
95e0: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 22  reateSequential"
95f0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55  ,     (SYSCALL)U
9600: 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74  uidCreateSequent
9610: 69 61 6c 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ial,   0 },.#els
9620: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  e.  { "UuidCreat
9630: 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20  eSequential",   
9640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
9670: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72  #define osUuidCr
9680: 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 20 5c  eateSequential \
9690: 0a 20 20 20 20 20 20 20 20 28 28 52 50 43 5f 53  .        ((RPC_S
96a0: 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a  TATUS(RPC_ENTRY*
96b0: 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c  )(UUID*))aSyscal
96c0: 6c 5b 37 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[78].pCurrent).
96d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
96e0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 26 26  LITE_NO_SYNC) &&
96f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
9700: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 46 6c 75  _SIZE>0.  { "Flu
9710: 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  shViewOfFile",  
9720: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
9730: 29 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65  )FlushViewOfFile
9740: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
9750: 6c 73 65 0a 20 20 7b 20 22 46 6c 75 73 68 56 69  lse.  { "FlushVi
9760: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
9770: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
97a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
97b0: 68 56 69 65 77 4f 66 46 69 6c 65 20 5c 0a 20 20  hViewOfFile \.  
97c0: 20 20 20 20 20 20 28 28 42 4f 4f 4c 28 57 49 4e        ((BOOL(WIN
97d0: 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 2c 53 49  API*)(LPCVOID,SI
97e0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 37  ZE_T))aSyscall[7
97f0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  9].pCurrent)..};
9800: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
9810: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
9820: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
9830: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
9840: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
9850: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
9860: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
9870: 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20   the.** "win32" 
9880: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
9890: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
98a0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
98b0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
98c0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
98d0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
98e0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
98f0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
9900: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
9910: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
9920: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53  atic int winSetS
9930: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
9940: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
9950: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
9960: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
9970: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
9980: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
99a0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
99b0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
99c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
99d0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
99e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
99f0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
9a00: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
9a10: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
9a20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9a30: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
9a40: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9a50: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
9a60: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
9a70: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
9a80: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
9a90: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
9aa0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
9ab0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
9ac0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
9ad0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
9ae0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9af0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
9b00: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
9b10: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
9b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9b30: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
9b40: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
9b50: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
9b60: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
9b70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
9b80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9b90: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
9ba0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
9bb0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
9bc0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
9bd0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
9be0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
9bf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9c00: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
9c10: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
9c20: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
9c30: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
9c40: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
9c50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9c60: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
9c70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
9c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
9c90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
9ca0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
9cb0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
9cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
9cd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9ce0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
9cf0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
9d00: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
9d10: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
9d20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
9d30: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
9d40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9d70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9d80: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
9d90: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
9da0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
9db0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
9dc0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
9dd0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
9de0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
9df0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
9e00: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
9e10: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
9e20: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
9e30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e  _syscall_ptr win
9e40: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
9e50: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
9e60: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
9e70: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
9e80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
9e90: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
9ea0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
9eb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9ec0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
9ed0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
9ee0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
9ef0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
9f00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
9f10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
9f20: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9f30: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
9f40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
9f50: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
9f60: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
9f70: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
9f80: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
9f90: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
9fa0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
9fb0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
9fc0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
9fd0: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
9fe0: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
9ff0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
a000: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
a010: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
a020: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
a030: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
a040: 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d  r *winNextSystem
a050: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
a060: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
a070: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
a080: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
a090: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
a0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
a0b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
a0c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
a0d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
a0e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
a0f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
a100: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
a110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
a120: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
a130: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
a140: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
a150: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
a160: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
a170: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
a180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
a190: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a1a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
a1b0: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
a1c0: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
a1d0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
a1e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
a1f0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
a200: 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f  compact it.  Upo
a210: 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
a220: 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74  E_OK will be ret
a230: 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69  urned.  Upon fai
a240: 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20  lure, one.** of 
a250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51  SQLITE_NOMEM, SQ
a260: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53  LITE_ERROR, or S
a270: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77  QLITE_NOTFOUND w
a280: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
a290: 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67    The.** "pnLarg
a2a0: 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69  est" argument, i
a2b0: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c  f non-zero, will
a2c0: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75   be used to retu
a2d0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
a2e0: 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f  he.** largest co
a2f0: 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f  mmitted free blo
a300: 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20  ck in the heap, 
a310: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74  in bytes..*/.int
a320: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63   sqlite3_win32_c
a330: 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49  ompact_heap(LPUI
a340: 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20  NT pnLargest){. 
a350: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a360: 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72  _OK;.  UINT nLar
a370: 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44  gest = 0;.  HAND
a380: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
a390: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
a3a0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
a3b0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
a3c0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
a3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
a3e0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
a3f0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
a400: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
a410: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
a420: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
a430: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
a440: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
a450: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
a460: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
a470: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
a480: 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
a490: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
a4a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
a4b0: 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65  ( (nLargest=osHe
a4c0: 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c  apCompact(hHeap,
a4d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
a4e0: 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b  AP_FLAGS))==0 ){
a4f0: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
a500: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
a510: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28  Error();.    if(
a520: 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45   lastErrno==NO_E
a530: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71  RROR ){.      sq
a540: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a550: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
a560: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
a570: 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d  no space), heap=
a580: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
a590: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
a5a0: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eap);.      rc =
a5b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
a5c0: 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
a5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
a5e0: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22  (SQLITE_ERROR, "
a5f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
a600: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61  mpact (%lu), hea
a610: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
a620: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
a630: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
a640: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  *)hHeap);.      
a650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
a660: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
a670: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  se.  sqlite3_log
a680: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  (SQLITE_NOTFOUND
a690: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
a6a0: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25  pCompact, heap=%
a6b0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
a6c0: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
a6d0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
a6e0: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a  OTFOUND;.#endif.
a6f0: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20    if( pnLargest 
a700: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e  ) *pnLargest = n
a710: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72  Largest;.  retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
a730: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
a740: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
a750: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
a760: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
a770: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74  tempt to.** dest
a780: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
a790: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e   it.  If the Win
a7a0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69  32 native heap i
a7b0: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61  s not isolated a
a7c0: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c  nd/or.** the sql
a7d0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a7e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  () function does
a7f0: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f   not return zero
a800: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69  , SQLITE_BUSY wi
a810: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65  ll.** be returne
a820: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73  d and no changes
a830: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
a840: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   the Win32 nativ
a850: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73  e heap..*/.int s
a860: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73  qlite3_win32_res
a870: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74  et_heap(){.  int
a880: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47   rc;.  MUTEX_LOG
a890: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
a8a0: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a  x *pMaster; ) /*
a8b0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
a8c0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a8d0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
a8e0: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20  _mutex *pMem; ) 
a8f0: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73     /* The memsys
a900: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
a910: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a920: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a930: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a940: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a950: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54  MASTER); ).  MUT
a960: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d  EX_LOGIC( pMem =
a970: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
a980: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a990: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20  STATIC_MEM); ). 
a9a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a9b0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
a9c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a9d0: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69  nter(pMem);.  wi
a9e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a9f0: 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47  );.  if( winMemG
aa00: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26  etHeap()!=NULL &
aa10: 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  & winMemGetOwned
aa20: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65  () && sqlite3_me
aa30: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
aa40: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
aa50: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
aa60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
aa70: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65  o outstanding me
aa80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
aa90: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68   on.    ** the h
aaa0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63  eap.  Also, sinc
aab0: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65  e both the maste
aac0: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63  r and memsys loc
aad0: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ks are currently
aae0: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65  .    ** being he
aaf0: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68  ld by us, no oth
ab00: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  er function (i.e
ab10: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  . from another t
ab20: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20  hread) should.  
ab30: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20    ** be able to 
ab40: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20  even access the 
ab50: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74  heap.  Attempt t
ab60: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  o destroy and re
ab70: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a  create our.    *
ab80: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32  * isolated Win32
ab90: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77   native heap now
aba0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
abb0: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
abc0: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
abd0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
abe0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
abf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ac00: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
ac10: 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d  =0 );.    winMem
ac20: 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47  Shutdown(winMemG
ac30: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
ac40: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
ac50: 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20  GetHeap()==NULL 
ac60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
ac70: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
ac80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ac90: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
aca0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
acb0: 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28  rc = winMemInit(
acc0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
acd0: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
ace0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
acf0: 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  | winMemGetHeap(
ad00: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
ad10: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
ad20: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
ad30: 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20  tOwned() );.    
ad40: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ad50: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
ad60: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
ad70: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
ad80: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
ad90: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
ada0: 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  p cannot be modi
adb0: 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20  fied because it 
adc0: 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20  may be in use.. 
add0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
ade0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
adf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ae00: 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73  leave(pMem);.  s
ae10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ae20: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
ae30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ae40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
ae50: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
ae60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ae70: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70  n outputs the sp
ae80: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73  ecified (ANSI) s
ae90: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e  tring to the Win
aea0: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28  32 debugger.** (
aeb0: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
aec0: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  /..void sqlite3_
aed0: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
aee0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  g(const char *zB
aef0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
af00: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51   char zDbgBuf[SQ
af10: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
af20: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  UF_SIZE];.  int 
af30: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c  nMin = MIN(nBuf,
af40: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44   (SQLITE_WIN32_D
af50: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29  BG_BUF_SIZE - 1)
af60: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67  ); /* may be neg
af70: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20  ative. */.  if( 
af80: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d  nMin<-1 ) nMin =
af90: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61   -1; /* all nega
afa0: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f  tive values beco
afb0: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65  me -1. */.  asse
afc0: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20  rt( nMin==-1 || 
afd0: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c  nMin==0 || nMin<
afe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
aff0: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66  _BUF_SIZE );.#if
b000: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b010: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
b020: 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 28  ( !zBuf ){.    (
b030: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
b040: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
b050: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
b060: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
b070: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
b080: 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  I).  if( nMin>0 
b090: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
b0a0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
b0b0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
b0c0: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
b0d0: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
b0e0: 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74  nMin);.    osOut
b0f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
b100: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
b110: 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  e{.    osOutputD
b120: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66  ebugStringA(zBuf
b130: 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66  );.  }.#elif def
b140: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b150: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65  2_HAS_WIDE).  me
b160: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
b170: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
b180: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69  G_BUF_SIZE);.  i
b190: 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  f ( osMultiByteT
b1a0: 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 20  oWideChar(.     
b1b0: 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70       osAreFileAp
b1c0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
b1d0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c  P : CP_OEMCP, 0,
b1e0: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
b1f0: 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a   nMin, (LPWSTR)z
b200: 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57  DbgBuf, SQLITE_W
b210: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
b220: 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29  E/sizeof(WCHAR))
b230: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
b240: 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75  n;.  }.  osOutpu
b250: 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c  tDebugStringW((L
b260: 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b  PCWSTR)zDbgBuf);
b270: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69  .#else.  if( nMi
b280: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
b290: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
b2a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
b2b0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
b2c0: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
b2d0: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66  uf, nMin);.    f
b2e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
b2f0: 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20  %s", zDbgBuf);. 
b300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
b310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
b320: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
b330: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
b340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
b350: 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 20  ne suspends the 
b360: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 66  current thread f
b370: 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a  or at least ms.*
b380: 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20  * milliseconds. 
b390: 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
b3a0: 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ent to the Win32
b3b0: 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61   Sleep() interfa
b3c0: 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ce..*/.#if SQLIT
b3d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69  E_OS_WINRT.stati
b3e0: 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62  c HANDLE sleepOb
b3f0: 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  j = NULL;.#endif
b400: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
b410: 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44  in32_sleep(DWORD
b420: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a   milliseconds){.
b430: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
b440: 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70  NRT.  if ( sleep
b450: 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj==NULL ){.   
b460: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72   sleepObj = osCr
b470: 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c  eateEventExW(NUL
b480: 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f  L, NULL, CREATE_
b490: 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53  EVENT_MANUAL_RES
b4a0: 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ET,.            
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29      SYNCHRONIZE)
b4d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b4e0: 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
b4f0: 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ;.  osWaitForSin
b500: 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65  gleObjectEx(slee
b510: 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e  pObj, millisecon
b520: 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73  ds, FALSE);.#els
b530: 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c  e.  osSleep(mill
b540: 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69  iseconds);.#endi
b550: 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
b560: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
b570: 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45 5f  DS>0 && !SQLITE_
b580: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
b590: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
b5a0: 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  \.        SQLITE
b5b0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 44 57  _THREADSAFE>0.DW
b5c0: 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e 33 32  ORD sqlite3Win32
b5d0: 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f 62 6a  Wait(HANDLE hObj
b5e0: 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20 72 63  ect){.  DWORD rc
b5f0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d  ;.  while( (rc =
b600: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
b610: 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65 63 74  ObjectEx(hObject
b620: 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20 20 20  , INFINITE,.    
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 54 52 55 45 29 29 3d 3d 57 41 49 54 5f     TRUE))==WAIT_
b660: 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b  IO_COMPLETION ){
b670: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b680: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b690: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
b6a0: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
b6b0: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
b6c0: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
b6d0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
b6e0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
b6f0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
b700: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
b710: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
b720: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
b730: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
b740: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
b750: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
b760: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b770: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
b780: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
b790: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
b7a0: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
b7b0: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
b7c0: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
b7d0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
b7e0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
b7f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
b800: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
b810: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
b820: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
b830: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
b840: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
b850: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
b860: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
b870: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
b880: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23  eEx() API..*/..#
b890: 69 66 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32  if !SQLITE_WIN32
b8a0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
b8b0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b8c0: 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54   (1).#elif SQLIT
b8d0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
b8e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c  LITE_OS_WINRT ||
b8f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b900: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
b910: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
b920: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
b930: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b940: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
b950: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b960: 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66   (0).#else.# def
b970: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28  ine osIsNT()  ((
b980: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
b990: 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77  =2) || sqlite3_w
b9a0: 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65  in32_is_nt()).#e
b9b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
b9c0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
b9d0: 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63 68  ines if the mach
b9e0: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ine is running a
b9f0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64   version of Wind
ba00: 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ows.** based on 
ba10: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a  the NT kernel..*
ba20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
ba30: 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b  n32_is_nt(void){
ba40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
ba50: 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INRT.  /*.  ** N
ba60: 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20 73  OTE: The WinRT s
ba70: 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20 61  ub-platform is a
ba80: 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f  lways assumed to
ba90: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
baa0: 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b   NT.  **       k
bab0: 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  ernel..  */.  re
bac0: 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 53 51  turn 1;.#elif SQ
bad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
bae0: 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73  RSIONEX.  if( os
baf0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bb00: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bb10: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20  te3_os_type, 0, 
bb20: 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  0)==0 ){.#if def
bb30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bb40: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
bb50: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
bb60: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
bb70: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
bb80: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
bb90: 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65  fo);.    osGetVe
bba0: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29  rsionExA(&sInfo)
bbb0: 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63  ;.    osInterloc
bbc0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
bbd0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
bbe0: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49  ype,.        (sI
bbf0: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
bc00: 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d   == VER_PLATFORM
bc10: 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a  _WIN32_NT) ? 2 :
bc20: 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64 65   1, 0);.#elif de
bc30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
bc40: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
bc50: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20   OSVERSIONINFOW 
bc60: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
bc70: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
bc80: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
bc90: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
bca0: 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f  ersionExW(&sInfo
bcb0: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
bcc0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
bcd0: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
bce0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
bcf0: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
bd00: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
bd10: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
bd20: 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  : 1, 0);.#endif.
bd30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49    }.  return osI
bd40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
bd50: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
bd60: 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32  e3_os_type, 2, 2
bd70: 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49  )==2;.#elif SQLI
bd80: 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e  TE_TEST.  return
bd90: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
bda0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
bdb0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
bdc0: 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a  2, 2)==2;.#else.
bdd0: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
bde0: 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  All sub-platform
bdf0: 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74 56  s where the GetV
be00: 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e  ersionEx[AW] fun
be10: 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20  ctions are.  ** 
be20: 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65 64        deprecated
be30: 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73 75   are always assu
be40: 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20  med to be based 
be50: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
be60: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
be70: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  1;.#endif.}..#if
be80: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
be90: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c  _MALLOC./*.** Al
bea0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
beb0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
bec0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
bed0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
bee0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
bef0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
bf00: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
bf10: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
bf20: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
bf30: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bf40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bf50: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
bf60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
bf70: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
bf80: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
bf90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
bfa0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
bfb0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
bfc0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
bfd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
bfe0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
bff0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
c000: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
c010: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
c020: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c030: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c040: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
c050: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
c060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c070: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
c080: 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20  ed to HeapAlloc 
c090: 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20  %u bytes (%lu), 
c0a0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
c0b0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
c0c0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c0d0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
c0e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c0f0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
c100: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
c110: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
c120: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
c130: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
c140: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
c150: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
c160: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
c170: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
c180: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
c190: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
c1a0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
c1b0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
c1c0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
c1d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
c1e0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
c1f0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
c200: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
c210: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c220: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
c230: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  r) );.#endif.  i
c240: 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74  f( !pPrior ) ret
c250: 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20  urn; /* Passing 
c260: 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65  NULL to HeapFree
c270: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a   is undefined. *
c280: 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46  /.  if( !osHeapF
c290: 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ree(hHeap, SQLIT
c2a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c2b0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20  GS, pPrior) ){. 
c2c0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c2d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
c2e0: 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65  iled to HeapFree
c2f0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
c300: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c310: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
c320: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
c330: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
c340: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
c350: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
c360: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
c370: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
c380: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
c390: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
c3a0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
c3b0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
c3c0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
c3d0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
c3e0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
c3f0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
c400: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
c410: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
c420: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
c430: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
c440: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
c450: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
c460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
c470: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
c480: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
c490: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
c4a0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c4b0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
c4c0: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
c4d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c4e0: 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  s>=0 );.  if( !p
c4f0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d  Prior ){.    p =
c500: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
c510: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c520: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
c530: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
c540: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f  }else{.    p = o
c550: 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65  sHeapReAlloc(hHe
c560: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c570: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
c580: 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  ior, (SIZE_T)nBy
c590: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tes);.  }.  if( 
c5a0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
c5b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c5c0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25  EM, "failed to %
c5d0: 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29  s %u bytes (%lu)
c5e0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
c600: 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f  or ? "HeapReAllo
c610: 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22  c" : "HeapAlloc"
c620: 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c  , nBytes, osGetL
c630: 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
c640: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
c650: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
c660: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
c670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
c680: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
c690: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
c6a0: 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  , in bytes..*/.s
c6b0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
c6c0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
c6d0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
c6e0: 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69   SIZE_T n;..  wi
c6f0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
c700: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
c710: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
c720: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
c730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
c740: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
c750: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
c760: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
c770: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
c780: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
c790: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
c7a0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
c7b0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
c7c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c7d0: 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69 66  GS, p) );.#endif
c7e0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
c7f0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
c800: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
c810: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c820: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
c830: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
c840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c850: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
c860: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
c870: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ize block %p (%l
c880: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
c8a0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c8b0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
c8c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c8d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
c8e0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
c8f0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
c900: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
c910: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
c920: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
c930: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
c940: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
c950: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
c960: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
c970: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
c980: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
c990: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
c9a0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
c9b0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
c9c0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
c9d0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
c9e0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
c9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ca00: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
ca10: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31  nMemData->magic1
ca20: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
ca30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
ca40: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32  nMemData->magic2
ca50: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
ca60: 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  );..#if !SQLITE_
ca70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
ca80: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
ca90: 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e  EATE.  if( !pWin
caa0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
cab0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49 6e  {.    DWORD dwIn
cac0: 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49  itialSize = SQLI
cad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
cae0: 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f  IT_SIZE;.    DWO
caf0: 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  RD dwMaximumSize
cb00: 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74 65   = (DWORD)sqlite
cb10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
cb20: 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77 4d  eap;.    if( dwM
cb30: 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b  aximumSize==0 ){
cb40: 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d  .      dwMaximum
cb50: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49  Size = SQLITE_WI
cb60: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
cb70: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
cb80: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64   dwInitialSize>d
cb90: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a  wMaximumSize ){.
cba0: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53        dwInitialS
cbb0: 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53  ize = dwMaximumS
cbc0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ize;.    }.    p
cbd0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cbe0: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65  p = osHeapCreate
cbf0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45  (SQLITE_WIN32_HE
cc00: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_FLAGS,.      
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64  dwInitialSize, d
cc40: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20  wMaximumSize);. 
cc50: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44     if( !pWinMemD
cc60: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
cc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
cc80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
cc90: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
cca0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25  to HeapCreate (%
ccb0: 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69  lu), flags=%u, i
ccc0: 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78  nitSize=%lu, max
ccd0: 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20  Size=%lu",.     
cce0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
ccf0: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
cd00: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
cd10: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20  dwInitialSize,. 
cd20: 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69 6d           dwMaxim
cd30: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  umSize);.      r
cd40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cd50: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
cd60: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
cd70: 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20  bOwned = TRUE;. 
cd80: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
cd90: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
cda0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57  ;.  }.#else.  pW
cdb0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cdc0: 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48   = osGetProcessH
cdd0: 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57  eap();.  if( !pW
cde0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cdf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ce00: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
ce10: 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65  ,.        "faile
ce20: 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48  d to GetProcessH
ce30: 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65  eap (%lu)", osGe
ce40: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  tLastError());. 
ce50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ce60: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
ce70: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
ce80: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
ce90: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
cea0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
ceb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
cec0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
ced0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
cee0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
cef0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
cf00: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
cf10: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
cf20: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
cf30: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
cf40: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
cf50: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
cf60: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
cf70: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
cf80: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
cf90: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
cfa0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
cfb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cfc0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
cfd0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
cfe0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
cff0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
d000: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
d010: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
d020: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
d030: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
d040: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
d050: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
d060: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d070: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e  ata->magic1==WIN
d080: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20  MEM_MAGIC1 );.  
d090: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d0a0: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e  ata->magic2==WIN
d0b0: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20  MEM_MAGIC2 );.. 
d0c0: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
d0d0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
d0e0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
d0f0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
d100: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
d110: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
d120: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
d130: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
d140: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
d150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
d160: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
d170: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
d180: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
d190: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
d1a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
d1b0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
d1c0: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
d1d0: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
d1e0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
d1f0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
d200: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
d210: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
d220: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
d230: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
d240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d250: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
d260: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
d270: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
d280: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
d290: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
d2a0: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
d2b0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
d2c0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
d2d0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
d2e0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
d2f0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
d300: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
d310: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
d320: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
d330: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
d340: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
d350: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
d360: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
d370: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
d380: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
d390: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
d3a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d3b0: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
d3c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
d3d0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
d3e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
d3f0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
d400: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
d410: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
d420: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
d430: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
d440: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
d450: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
d460: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
d470: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
d480: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
d490: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
d4a0: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
d4b0: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
d4c0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
d4d0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
d4e0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
d4f0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
d500: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
d510: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
d520: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
d530: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
d540: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
d550: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
d560: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
d570: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
d580: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
d590: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d5a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
d5b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
d5c0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
d5d0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
d5e0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  de..**.** Space 
d5f0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
d600: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d610: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d620: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d630: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
d640: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
d650: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
d660: 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  xt){.  int nChar
d670: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
d680: 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  Text;..  nChar =
d690: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
d6a0: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
d6b0: 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55  0, zText, -1, NU
d6c0: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
d6d0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
d6e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
d6f0: 69 64 65 54 65 78 74 20 3d 20 73 71 6c 69 74 65  ideText = sqlite
d700: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
d710: 61 72 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ar*sizeof(WCHAR)
d720: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 54   );.  if( zWideT
d730: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
d750: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
d760: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
d770: 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d  TF8, 0, zText, -
d780: 31 2c 20 7a 57 69 64 65 54 65 78 74 2c 0a 20 20  1, zWideText,.  
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
d7b0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
d7c0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
d7d0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 54 65  te3_free(zWideTe
d7e0: 78 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54 65  xt);.    zWideTe
d7f0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  xt = 0;.  }.  re
d800: 74 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b 0a  turn zWideText;.
d810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
d820: 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69   a Microsoft Uni
d830: 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 55  code string to U
d840: 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  TF-8..**.** Spac
d850: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d860: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d870: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d880: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d890: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
d8a0: 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66  *winUnicodeToUtf
d8b0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54  8(LPCWSTR zWideT
d8c0: 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ext){.  int nByt
d8d0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74  e;.  char *zText
d8e0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
d8f0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
d900: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
d910: 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c  WideText, -1, 0,
d920: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
d930: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
d940: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d950: 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69 74  .  zText = sqlit
d960: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
d970: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54 65  yte );.  if( zTe
d980: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  xt==0 ){.    ret
d990: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
d9a0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
d9b0: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
d9c0: 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74  F8, 0, zWideText
d9d0: 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79  , -1, zText, nBy
d9e0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
da10: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
da20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
da30: 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78  zText);.    zTex
da40: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
da50: 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a  urn zText;.}../*
da60: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
da70: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
da80: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
da90: 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49 20   using the ANSI 
daa0: 6f 72 20 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20 70  or OEM.** code p
dab0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
dac0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
dad0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
dae0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
daf0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
db00: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
db10: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
db20: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
db30: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69  ext, int useAnsi
db40: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
db50: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 54 65    LPWSTR zMbcsTe
db60: 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  xt;.  int codepa
db70: 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20 43  ge = useAnsi ? C
db80: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
db90: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
dba0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
dbb0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
dbc0: 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  zText, -1, NULL,
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52   0)*sizeof(WCHAR
dc00: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
dc10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dc20: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 54 65  0;.  }.  zMbcsTe
dc30: 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  xt = sqlite3Mall
dc40: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
dc50: 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20  zeof(WCHAR) );. 
dc60: 20 69 66 28 20 7a 4d 62 63 73 54 65 78 74 3d 3d   if( zMbcsText==
dc70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dc80: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
dc90: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
dca0: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
dcb0: 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a   0, zText, -1, z
dcc0: 4d 62 63 73 54 65 78 74 2c 0a 20 20 20 20 20 20  MbcsText,.      
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
dcf0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
dd00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dd10: 66 72 65 65 28 7a 4d 62 63 73 54 65 78 74 29 3b  free(zMbcsText);
dd20: 0a 20 20 20 20 7a 4d 62 63 73 54 65 78 74 20 3d  .    zMbcsText =
dd30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
dd40: 20 7a 4d 62 63 73 54 65 78 74 3b 0a 7d 0a 0a 2f   zMbcsText;.}../
dd50: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d  *.** Convert a M
dd60: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
dd70: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c   string to a mul
dd80: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
dd90: 72 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 75 73 69  r string,.** usi
dda0: 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20 4f  ng the ANSI or O
ddb0: 45 4d 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a  EM code page..**
ddc0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
ddd0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
dde0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
ddf0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
de00: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
de10: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
de20: 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54  odeToMbcs(LPCWST
de30: 52 20 7a 57 69 64 65 54 65 78 74 2c 20 69 6e 74  R zWideText, int
de40: 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74   useAnsi){.  int
de50: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
de60: 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64  zText;.  int cod
de70: 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73 69 20  epage = useAnsi 
de80: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
de90: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
dea0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
deb0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
dec0: 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31  0, zWideText, -1
ded0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
dee0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
def0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
df00: 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73  .  }.  zText = s
df10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
df20: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
df30: 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
df40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
df50: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
df60: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
df70: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
df80: 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78 74  eText, -1, zText
df90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a    nByte, 0, 0);.
dfc0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
dfd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dfe0: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20  free(zText);.   
dff0: 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a   zText = 0;.  }.
e000: 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b 0a    return zText;.
e010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
e020: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68   a multi-byte ch
e030: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
e040: 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53  o UTF-8..**.** S
e050: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
e060: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
e070: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
e080: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
e090: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
e0a0: 61 72 20 2a 77 69 6e 4d 62 63 73 54 6f 55 74 66  ar *winMbcsToUtf
e0b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  8(const char *zT
e0c0: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69  ext, int useAnsi
e0d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74  ){.  char *zText
e0e0: 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Utf8;.  LPWSTR z
e0f0: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
e100: 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f  Wide = winMbcsTo
e110: 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c 20 75  Unicode(zText, u
e120: 73 65 41 6e 73 69 29 3b 0a 20 20 69 66 28 20 7a  seAnsi);.  if( z
e130: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
e140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e150: 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77 69    zTextUtf8 = wi
e160: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
e170: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
e180: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
e190: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65  e);.  return zTe
e1a0: 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xtUtf8;.}../*.**
e1b0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
e1c0: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c   string to a mul
e1d0: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
e1e0: 72 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  r string..**.** 
e1f0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
e200: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
e210: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
e220: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
e230: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
e240: 68 61 72 20 2a 77 69 6e 55 74 66 38 54 6f 4d 62  har *winUtf8ToMb
e250: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
e260: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
e270: 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  i){.  char *zTex
e280: 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  tMbcs;.  LPWSTR 
e290: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
e2a0: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54  pWide = winUtf8T
e2b0: 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b  oUnicode(zText);
e2c0: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
e2d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
e2e0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 4d   0;.  }.  zTextM
e2f0: 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  bcs = winUnicode
e300: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 2c  ToMbcs(zTmpWide,
e310: 20 75 73 65 41 6e 73 69 29 3b 0a 20 20 73 71 6c   useAnsi);.  sql
e320: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
e330: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  de);.  return zT
e340: 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  extMbcs;.}../*.*
e350: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
e360: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
e370: 68 65 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  he winUtf8ToUnic
e380: 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ode() function..
e390: 2a 2f 0a 4c 50 57 53 54 52 20 73 71 6c 69 74 65  */.LPWSTR sqlite
e3a0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
e3b0: 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  unicode(const ch
e3c0: 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64  ar *zText){.#ifd
e3d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e3e0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e3f0: 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28   !zText ){.    (
e400: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e410: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e420: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
e430: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e440: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
e450: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
e460: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
e470: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
e480: 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 55  eturn winUtf8ToU
e490: 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a 7d  nicode(zText);.}
e4a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e4b0: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72  a public wrapper
e4c0: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 6e 69 63   for the winUnic
e4d0: 6f 64 65 54 6f 55 74 66 38 28 29 20 66 75 6e 63  odeToUtf8() func
e4e0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e4f0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69  qlite3_win32_uni
e500: 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c 50 43  code_to_utf8(LPC
e510: 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b  WSTR zWideText){
e520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e530: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e540: 20 20 69 66 28 20 21 7a 57 69 64 65 54 65 78 74    if( !zWideText
e550: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e560: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e580: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e5a0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e5b0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e5c0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e5d0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e5e0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
e5f0: 7a 57 69 64 65 54 65 78 74 29 3b 0a 7d 0a 0a 2f  zWideText);.}../
e600: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
e610: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
e620: 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f 55  r the winMbcsToU
e630: 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  tf8() function..
e640: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
e650: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
e660: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tf8(const char *
e670: 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53  zText){.#ifdef S
e680: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e690: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54  _ARMOR.  if( !zT
e6a0: 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ext ){.    (void
e6b0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e6c0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
e6d0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
e6e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e6f0: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
e700: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
e710: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
e720: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
e730: 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28  n winMbcsToUtf8(
e740: 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c 65  zText, osAreFile
e750: 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a  ApisANSI());.}..
e760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
e770: 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66  public wrapper f
e780: 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f  or the winMbcsTo
e790: 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e  Utf8() function.
e7a0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
e7b0: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
e7c0: 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63 68  utf8_v2(const ch
e7d0: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
e7e0: 73 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66 20  seAnsi){.#ifdef 
e7f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e800: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
e810: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
e820: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e830: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e840: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
e850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e860: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
e870: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
e880: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
e890: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
e8a0: 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  rn winMbcsToUtf8
e8b0: 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29  (zText, useAnsi)
e8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e8d0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
e8e0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55  per for the winU
e8f0: 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e 63  tf8ToMbcs() func
e900: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e910: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
e920: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
e930: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69  char *zText){.#i
e940: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e950: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e960: 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20  f( !zText ){.   
e970: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
e980: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
e990: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
e9a0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e9b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
e9c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
e9d0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
e9e0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
e9f0: 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54   return winUtf8T
ea00: 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 6f 73 41  oMbcs(zText, osA
ea10: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
ea20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ea30: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
ea40: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
ea50: 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e  Utf8ToMbcs() fun
ea60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
ea70: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
ea80: 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f  f8_to_mbcs_v2(co
ea90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
eaa0: 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 23   int useAnsi){.#
eab0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
eac0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
ead0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
eae0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
eaf0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
eb00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
eb10: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
eb20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
eb30: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
eb40: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
eb50: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
eb60: 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38    return winUtf8
eb70: 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 75 73  ToMbcs(zText, us
eb80: 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eAnsi);.}../*.**
eb90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
eba0: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72  ets the data dir
ebb0: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65  ectory or the te
ebc0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
ebd0: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  y based on.** th
ebe0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d  e provided argum
ebf0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20  ents.  The type 
ec00: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
ec10: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   1 in order to s
ec20: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64  et the.** data d
ec30: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e  irectory or 2 in
ec40: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
ec50: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
ec60: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c  ctory.  The zVal
ec70: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  ue.** argument i
ec80: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
ec90: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75  e directory to u
eca0: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  se.  The return 
ecb0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  value will be.**
ecc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
ecd0: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
ece0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
ecf0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f  et_directory(DWO
ed00: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52  RD type, LPCWSTR
ed10: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72   zValue){.  char
ed20: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d   **ppDirectory =
ed30: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
ed40: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
ed50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
ed60: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
ed70: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
ed80: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
ed90: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
eda0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
edb0: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
edc0: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
edd0: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   &sqlite3_data_d
ede0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73  irectory;.  }els
edf0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49  e if( type==SQLI
ee00: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
ee10: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
ee20: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
ee30: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  = &sqlite3_temp_
ee40: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20  directory;.  }. 
ee50: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
ee60: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53  ctory || type==S
ee70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
ee80: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
ee90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70            || typ
eea0: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
eeb0: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
eec0: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  YPE.  );.  asser
eed0: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
eee0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
eef0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72  ugHasType(*ppDir
ef00: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f  ectory, MEMTYPE_
ef10: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70  HEAP) );.  if( p
ef20: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  pDirectory ){.  
ef30: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74    char *zValueUt
ef40: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  f8 = 0;.    if( 
ef50: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65  zValue && zValue
ef60: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61  [0] ){.      zVa
ef70: 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69  lueUtf8 = winUni
ef80: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75  codeToUtf8(zValu
ef90: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a  e);.      if ( z
efa0: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a  ValueUtf8==0 ){.
efb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
efc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
efd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
efe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
eff0: 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a  (*ppDirectory);.
f000: 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79      *ppDirectory
f010: 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20   = zValueUtf8;. 
f020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f030: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
f040: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
f050: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74  }../*.** The ret
f060: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e  urn value of win
f070: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  GetLastErrorMsg.
f080: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
f090: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
f0a0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
f0b0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
f0c0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
f0d0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
f0e0: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
f0f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
f100: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57  tLastErrorMsg(DW
f110: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69  ORD lastErrno, i
f120: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
f130: 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61  Buf){.  /* Forma
f140: 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73  tMessage returns
f150: 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20   0 on failure.  
f160: 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a  Otherwise it.  *
f170: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  * returns the nu
f180: 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77  mber of TCHARs w
f190: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
f1a0: 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  tput.  ** buffer
f1b0: 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
f1c0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c  terminating null
f1d0: 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57   char..  */.  DW
f1e0: 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20  ORD dwLen = 0;. 
f1f0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b   char *zOut = 0;
f200: 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
f210: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
f220: 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41  S_WINRT.    WCHA
f230: 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49  R zTempWide[SQLI
f240: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
f250: 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20  MSG_CHARS+1];.  
f260: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
f270: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
f280: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
f290: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
f2c0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
f2d0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
f360: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
f390: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
f3a0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50  0);.#else.    LP
f3d0: 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d  WSTR zTempWide =
f3e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
f3f0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
f400: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
f410: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
f420: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
f450: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
f480: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
f490: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
f4e0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65     (LPWSTR) &zTe
f530: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a       0);.#endif.
f580: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
f590: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
f5a0: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
f5b0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
f5c0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
f5d0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
f5e0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
f5f0: 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  Out = winUnicode
f600: 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65  ToUtf8(zTempWide
f610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f620: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
f630: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
f640: 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a  S_WINRT.      /*
f650: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
f660: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
f670: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
f680: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
f690: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64  calFree(zTempWid
f6a0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
f6b0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
f6c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
f6d0: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
f6e0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
f6f0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
f700: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
f710: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
f720: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
f750: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
f760: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
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 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
f790: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
f7a0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
f7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
f830: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
f880: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
f890: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
f8a0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
f8b0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
f8c0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
f8d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
f8e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
f8f0: 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74  ut = winMbcsToUt
f900: 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46  f8(zTemp, osAreF
f910: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
f920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
f930: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
f940: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
f950: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
f960: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
f970: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
f980: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
f990: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
f9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
f9b0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
f9c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f9d0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
f9e0: 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c  sError 0x%lx (%l
f9f0: 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  u)", lastErrno, 
fa00: 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65  lastErrno);.  }e
fa10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
fa20: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
fa30: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
fa40: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
fa50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fa60: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
fa70: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
fa80: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
fa90: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
faa0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
fab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
fac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68  ;.}../*.**.** Th
fad0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69  is function - wi
fae0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
faf0: 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ) - is only ever
fb00: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
fb10: 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45  macro.** winLogE
fb20: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rror()..**.** Th
fb30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
fb40: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
fb50: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
fb60: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  n OS function..*
fb70: 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  * It logs a mess
fb80: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
fb90: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
fba0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
fbb0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  alue of.** error
fbc0: 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f   code and, if po
fbd0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
fbe0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
fbf0: 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f  alent from.** Fo
fc00: 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a  rmatMessage..**.
fc10: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
fc20: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
fc30: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
fc40: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
fc50: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
fc60: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
fc70: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
fc80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
fc90: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
fca0: 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  )..** The two su
fcb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
fcc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
fcd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
fce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
fcf0: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
fd00: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
fd10: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
fd20: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
fd30: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
fd40: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
fd50: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
fd60: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
fd70: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
fd80: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
fd90: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
fda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
fdb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
fdc0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
fdd0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
fde0: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
fdf0: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
fe00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
fe30: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
fe40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fe50: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
fe60: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
fe70: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
fe80: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
fe90: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
feb0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
fec0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
fed0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
fee0: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
ff10: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
ff20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ff50: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
ff60: 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61   = 0;.  winGetLa
ff70: 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45  stErrorMsg(lastE
ff80: 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73  rrno, sizeof(zMs
ff90: 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73  g), zMsg);.  ass
ffa0: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
ffb0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
ffc0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
ffd0: 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d  h = "";.  for(i=
ffe0: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d  0; zMsg[i] && zM
fff0: 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a  sg[i]!='\r' && z
10000 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b  Msg[i]!='\n'; i+
10010 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d  +){}.  zMsg[i] =
10020 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   0;.  sqlite3_lo
10030 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
10040 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28   "os_win.c:%d: (
10050 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73  %lu) %s(%s) - %s
10060 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
10070 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
10080 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
10090 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
100a0 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
100b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
100c0 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
100d0 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
100e0 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
100f0 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
10100 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
10110 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
10120 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
10130 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72  ed by.** antivir
10140 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c  us software.  Al
10150 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64  so the initial d
10160 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20  elay before the 
10170 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20  first retry..** 
10180 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61  The delay increa
10190 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74  ses linearly wit
101a0 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f  h each retry..*/
101b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
101c0 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
101d0 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
101e0 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
101f0 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69  TRY 10.#endif.#i
10200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
10210 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
10220 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ELAY.# define SQ
10230 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
10240 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a  _RETRY_DELAY 25.
10250 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e  #endif.static in
10260 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20  t winIoerrRetry 
10270 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
10280 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
10290 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
102a0 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49  etryDelay = SQLI
102b0 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
102c0 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a  ETRY_DELAY;../*.
102d0 2a 2a 20 54 68 65 20 22 77 69 6e 49 73 4c 6f 63  ** The "winIsLoc
102e0 6b 69 6e 67 45 72 72 6f 72 22 20 6d 61 63 72 6f  kingError" macro
102f0 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
10300 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74 69  rmine if a parti
10310 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72  cular I/O.** err
10320 6f 72 20 63 6f 64 65 20 69 73 20 64 75 65 20 74  or code is due t
10330 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 20  o file locking. 
10340 20 49 74 20 6d 75 73 74 20 61 63 63 65 70 74 20   It must accept 
10350 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 44  the error code D
10360 57 4f 52 44 0a 2a 2a 20 61 73 20 69 74 73 20 6f  WORD.** as its o
10370 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  nly argument and
10380 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e   should return n
10390 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
103a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 64 75 65  rror code is due
103b0 0a 2a 2a 20 74 6f 20 66 69 6c 65 20 6c 6f 63 6b  .** to file lock
103c0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ing..*/.#if !def
103d0 69 6e 65 64 28 77 69 6e 49 73 4c 6f 63 6b 69 6e  ined(winIsLockin
103e0 67 45 72 72 6f 72 29 0a 23 64 65 66 69 6e 65 20  gError).#define 
103f0 77 69 6e 49 73 4c 6f 63 6b 69 6e 67 45 72 72 6f  winIsLockingErro
10400 72 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f  r(a) (((a)==ERRO
10410 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29  R_ACCESS_DENIED)
10420 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
10450 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c  =ERROR_LOCK_VIOL
10460 41 54 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20  ATION)       || 
10470 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 28 28 61 29 3d 3d 45 52 52 4f 52 5f 49 4f 5f 50  ((a)==ERROR_IO_P
104a0 45 4e 44 49 4e 47 29 29 0a 23 65 6e 64 69 66 0a  ENDING)).#endif.
104b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69 6e 49  ./*.** The "winI
104c0 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d  oerrCanRetry1" m
104d0 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
104e0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 70  determine if a p
104f0 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a  articular I/O.**
10500 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62 74 61   error code obta
10510 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61 73 74  ined via GetLast
10520 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69 67 69  Error() is eligi
10530 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69 65  ble to be retrie
10540 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74 20 61  d.  It.** must a
10550 63 63 65 70 74 20 74 68 65 20 65 72 72 6f 72 20  ccept the error 
10560 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20 69 74  code DWORD as it
10570 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  s only argument 
10580 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74 75 72  and should retur
10590 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  n.** non-zero if
105a0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
105b0 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 20  is transient in 
105c0 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65 20 6f  nature and the o
105d0 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65 73 70  peration.** resp
105e0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65 6e 65  onsible for gene
105f0 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  rating the origi
10600 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68 74 20  nal error might 
10610 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62 65 69  succeed upon bei
10620 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 20  ng.** retried.  
10630 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
10640 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c  this macro shoul
10650 64 20 62 65 20 61 20 76 61 72 69 61 62 6c 65 2e  d be a variable.
10660 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
10670 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e 61 6d  lly, a macro nam
10680 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  ed "winIoerrCanR
10690 65 74 72 79 32 22 20 6d 61 79 20 62 65 20 64 65  etry2" may be de
106a0 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  fined.  If it.**
106b0 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69 74 20   is defined, it 
106c0 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65  will be consulte
106d0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20  d only when the 
106e0 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72 72 43  macro "winIoerrC
106f0 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72 65 74  anRetry1".** ret
10700 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  urns zero.  The 
10710 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
10720 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63 6f 6d  y2" macro is com
10730 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e 61 6c  pletely optional
10740 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65 20 75   and.** may be u
10750 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 61  sed to include a
10760 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f 72 20  dditional error 
10770 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 65 74  codes in the set
10780 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
10790 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 66 61  result in the fa
107a0 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72 61 74  iling I/O operat
107b0 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72 69 65  ion being retrie
107c0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
107d0 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65 64 2c    If.** defined,
107e0 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   the "winIoerrCa
107f0 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 6d  nRetry2" macro m
10800 75 73 74 20 65 78 68 69 62 69 74 20 65 78 74 65  ust exhibit exte
10810 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73 0a 2a  rnal semantics.*
10820 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74  * identical to t
10830 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77 69 6e  hose of the "win
10840 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20  IoerrCanRetry1" 
10850 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64  macro..*/.#if !d
10860 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43  efined(winIoerrC
10870 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66 69 6e  anRetry1).#defin
10880 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  e winIoerrCanRet
10890 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d 45 52  ry1(a) (((a)==ER
108a0 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
108b0 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  D)        || \. 
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
108e0 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47  )==ERROR_SHARING
108f0 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c  _VIOLATION)    |
10900 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f    ((a)==ERROR_LO
10930 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20  CK_VIOLATION)   
10940 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10960 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
10970 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49 53 54  OR_DEV_NOT_EXIST
10980 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  )        || \.  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
109b0 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f  ==ERROR_NETNAME_
109c0 44 45 4c 45 54 45 44 29 20 20 20 20 20 20 7c 7c  DELETED)      ||
109d0 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d   ((a)==ERROR_SEM
10a00 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20 20 20  _TIMEOUT)       
10a10 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
10a40 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43  R_NETWORK_UNREAC
10a50 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a  HABLE)).#endif..
10a60 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46  /*.** If a ReadF
10a70 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69  ile() or WriteFi
10a80 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  le() error occur
10a90 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  s, invoke this r
10aa0 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65  outine.** to see
10ab0 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65   if it should be
10ac0 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72   retried.  Retur
10ad0 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e  n TRUE to retry.
10ae0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
10af0 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74  * to give up wit
10b00 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  h an error..*/.s
10b10 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 74  tatic int winRet
10b20 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52  ryIoerr(int *pnR
10b30 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72  etry, DWORD *pEr
10b40 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20  ror){.  DWORD e 
10b50 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
10b60 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74  ();.  if( *pnRet
10b70 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74 72  ry>=winIoerrRetr
10b80 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72  y ){.    if( pEr
10b90 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  ror ){.      *pE
10ba0 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a  rror = e;.    }.
10bb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10bc0 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65 72 72  }.  if( winIoerr
10bd0 43 61 6e 52 65 74 72 79 31 28 65 29 20 29 7b 0a  CanRetry1(e) ){.
10be0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
10bf0 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72  2_sleep(winIoerr
10c00 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
10c10 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
10c20 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
10c30 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20  turn 1;.  }.#if 
10c40 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72  defined(winIoerr
10c50 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65 6c 73  CanRetry2).  els
10c60 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61  e if( winIoerrCa
10c70 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a 20 20  nRetry2(e) ){.  
10c80 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
10c90 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65  sleep(winIoerrRe
10ca0 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52  tryDelay*(1+*pnR
10cb0 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70  etry));.    ++*p
10cc0 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75  nRetry;.    retu
10cd0 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 1;.  }.#endif
10ce0 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b  .  if( pError ){
10cf0 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65  .    *pError = e
10d00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61  ;.}../*.** Log a
10d20 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79   I/O error retry
10d30 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61   episode..*/.sta
10d40 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49  tic void winLogI
10d50 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79 2c  oerr(int nRetry,
10d60 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20   int lineno){.  
10d70 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20  if( nRetry ){.  
10d80 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
10d90 4c 49 54 45 5f 4e 4f 54 49 43 45 2c 0a 20 20 20  LITE_NOTICE,.   
10da0 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73     "delayed %dms
10db0 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e   for lock/sharin
10dc0 67 20 63 6f 6e 66 6c 69 63 74 20 61 74 20 6c 69  g conflict at li
10dd0 6e 65 20 25 64 22 2c 0a 20 20 20 20 20 20 77 69  ne %d",.      wi
10de0 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
10df0 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b  *nRetry*(nRetry+
10e00 31 29 2f 32 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20  1)/2, lineno.   
10e10 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
10e20 20 54 68 69 73 20 23 69 66 20 64 6f 65 73 20 6e   This #if does n
10e30 6f 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 53  ot rely on the S
10e40 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 64  QLITE_OS_WINCE d
10e50 65 66 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  efine because th
10e60 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
10e70 6e 67 20 73 65 63 74 69 6f 6e 20 69 6e 20 22 64  ng section in "d
10e80 61 74 65 2e 63 22 20 63 61 6e 6e 6f 74 20 75 73  ate.c" cannot us
10e90 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  e it..*/.#if !de
10ea0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10eb0 54 5f 4c 4f 43 41 4c 54 49 4d 45 29 20 26 26 20  T_LOCALTIME) && 
10ec0 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
10ed0 43 45 29 20 26 26 20 5c 0a 20 20 20 20 28 21 64  CE) && \.    (!d
10ee0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53  efined(SQLITE_MS
10ef0 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
10f00 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56  ) || !SQLITE_MSV
10f10 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29  C_LOCALTIME_API)
10f20 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20  ./*.** The MSVC 
10f30 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  CRT on Windows C
10f40 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  E may not have a
10f50 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e   localtime() fun
10f60 63 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 20 64 65 66  ction..** So def
10f70 69 6e 65 20 61 20 73 75 62 73 74 69 74 75 74 65  ine a substitute
10f80 2e 0a 2a 2f 0a 23 20 20 69 6e 63 6c 75 64 65 20  ..*/.#  include 
10f90 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
10fa0 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
10fb0 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
10fc0 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
10fd0 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
10fe0 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
10ff0 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
11000 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   pTm;.  sqlite3_
11010 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34  int64 t64;.  t64
11020 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28   = *t;.  t64 = (
11030 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30  t64 + 1164447360
11040 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75  0)*10000000;.  u
11050 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  Tm.dwLowDateTime
11060 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26   = (DWORD)(t64 &
11070 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20   0xFFFFFFFF);.  
11080 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69  uTm.dwHighDateTi
11090 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  me= (DWORD)(t64 
110a0 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65  >> 32);.  osFile
110b0 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
110c0 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
110d0 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79    osFileTimeToSy
110e0 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
110f0 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
11100 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
11110 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
11120 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
11130 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
11140 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
11150 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
11160 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
11170 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
11180 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
11190 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
111a0 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
111b0 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
111c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
111d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
111e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
111f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
11230 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
11240 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
11250 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 64 65 66  CE only..*/.#def
11260 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
11270 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
11280 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
11290 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
112a0 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
112b0 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
112c0 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
112d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
112e0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
112f0 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
11300 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
11310 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
11320 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
11330 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49  Object(h, INFINI
11340 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20  TE);.   } while 
11350 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f  (dwErr != WAIT_O
11360 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72  BJECT_0 && dwErr
11370 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e   != WAIT_ABANDON
11380 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c  ED);.}./*.** Rel
11390 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75  ease a lock acqu
113a0 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74  ired by winceMut
113b0 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23  exAcquire().*/.#
113c0 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65  define winceMute
113d0 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65  xRelease(h) Rele
113e0 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a  aseMutex(h)../*.
113f0 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75  ** Create the mu
11400 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d  tex and shared m
11410 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  emory used for l
11420 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69  ocking in the fi
11430 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
11440 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63   pFile.*/.static
11450 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74 65   int winceCreate
11460 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  Lock(const char 
11470 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46  *zFilename, winF
11480 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c  ile *pFile){.  L
11490 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50  PWSTR zTok;.  LP
114a0 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57  WSTR zName;.  DW
114b0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
114c0 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20   BOOL bLogged = 
114d0 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49  FALSE;.  BOOL bI
114e0 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a  nit = TRUE;..  z
114f0 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54 6f  Name = winUtf8To
11500 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
11510 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
11520 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75 74  =0 ){.    /* out
11530 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
11540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11550 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
11560 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
11570 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c  ialize the local
11580 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d   lockdata */.  m
11590 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f  emset(&pFile->lo
115a0 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  cal, 0, sizeof(p
115b0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a  File->local));..
115c0 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
115d0 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f   backslashes fro
115e0 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  m the filename a
115f0 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a  nd lowercase it.
11600 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61    ** to derive a
11610 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a   mutex name. */.
11620 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c    zTok = osCharL
11630 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  owerW(zName);.  
11640 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b  for (;*zTok;zTok
11650 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54  ++){.    if (*zT
11660 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f  ok == '\\') *zTo
11670 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20  k = '_';.  }..  
11680 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74  /* Create/open t
11690 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a  he named mutex *
116a0 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65  /.  pFile->hMute
116b0 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65  x = osCreateMute
116c0 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20  xW(NULL, FALSE, 
116d0 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70  zName);.  if (!p
116e0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
116f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11700 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11710 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c 69  rror();.    sqli
11720 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
11730 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
11740 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11750 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
11760 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11780 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31  winceCreateLock1
11790 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
117a0 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
117b0 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72   the mutex befor
117c0 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a  e continuing */.
117d0 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
117e0 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
117f0 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20  x);..  /* Since 
11800 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d  the names of nam
11810 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61  ed mutexes, sema
11820 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70  phores, file map
11830 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20 20  pings etc are.  
11840 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
11850 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
11860 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
11870 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
11880 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
11890 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
118a0 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
118b0 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
118c0 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28  .  osCharUpperW(
118d0 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  zName);.  pFile-
118e0 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65  >hShared = osCre
118f0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
11900 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
11910 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
11950 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
11960 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
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 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20    zName);..  /* 
119a0 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20  Set a flag that 
119b0 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20  indicates we're 
119c0 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65  the first to cre
119d0 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ate the memory s
119e0 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62  o it.  ** must b
119f0 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a  e zero-initializ
11a00 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e  ed */.  lastErrn
11a10 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
11a20 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74  or();.  if (last
11a30 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41  Errno == ERROR_A
11a40 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a  LREADY_EXISTS){.
11a50 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53      bInit = FALS
11a60 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
11a70 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a  3_free(zName);..
11a80 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65    /* If we succe
11a90 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74  eded in making t
11aa0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
11ab0 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e   handle, map it.
11ac0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11ad0 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  >hShared ){.    
11ae0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20  pFile->shared = 
11af0 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61  (winceLock*)osMa
11b00 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
11b10 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20 20  e->hShared,.    
11b20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41           FILE_MA
11b30 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f  P_READ|FILE_MAP_
11b40 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a  WRITE, 0, 0, siz
11b50 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
11b60 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69  .    /* If mappi
11b70 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65  ng failed, close
11b80 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
11b90 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72  ry handle and er
11ba0 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ase it */.    if
11bb0 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ( !pFile->shared
11bc0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
11bd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
11be0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
11bf0 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
11c00 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
11c10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
11c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11c30 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
11c40 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
11c50 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64  );.      bLogged
11c60 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f   = TRUE;.      o
11c70 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
11c80 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20  le->hShared);.  
11c90 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72      pFile->hShar
11ca0 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ed = NULL;.    }
11cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68  .  }..  /* If sh
11cc0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c  ared memory coul
11cd0 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  d not be created
11ce0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
11cf0 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20   mutex and fail 
11d00 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11d10 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b  hShared==NULL ){
11d20 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65  .    if( !bLogge
11d30 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
11d40 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
11d50 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77  stErrno;.      w
11d60 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11d70 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e  E_IOERR, pFile->
11d80 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
11da0 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c  nceCreateLock3",
11db0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
11dc0 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55     bLogged = TRU
11dd0 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e  E;.    }.    win
11de0 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
11df0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
11e00 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
11e10 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11e20 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
11e30 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72  ex = NULL;.    r
11e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11e50 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  RR;.  }..  /* In
11e60 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61  itialize the sha
11e70 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65  red memory if we
11e80 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20  're supposed to 
11e90 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29  */.  if( bInit )
11ea0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  {.    memset(pFi
11eb0 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73  le->shared, 0, s
11ec0 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
11ed0 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
11ee0 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
11ef0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
11f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11f10 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
11f20 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e   the part of win
11f30 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20  File that deals 
11f40 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73  with wince locks
11f50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11f60 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
11f70 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
11f80 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  {.  if (pFile->h
11f90 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41  Mutex){.    /* A
11fa0 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
11fb0 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
11fc0 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
11fd0 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >hMutex);..    /
11fe0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
11ff0 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72  blocks should pr
12000 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e  obably assert in
12010 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74   debug mode, but
12020 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65   they.       are
12030 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63   to cleanup in c
12040 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65  ase any locks re
12050 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20  mained open */. 
12060 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
12070 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
12080 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12090 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
120a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
120b0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
120c0 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46  erved){.      pF
120d0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
120e0 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
120f0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
12100 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
12110 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
12120 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
12130 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
12140 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
12150 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
12160 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ve){.      pFile
12170 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
12180 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
12190 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72    }..    /* De-r
121a0 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f  eference and clo
121b0 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74  se our copy of t
121c0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
121d0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f   handle */.    o
121e0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
121f0 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b  (pFile->shared);
12200 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
12210 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
12220 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65  d);..    /* Done
12230 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20   with the mutex 
12240 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
12250 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
12260 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43  hMutex);.    osC
12270 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
12280 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70  ->hMutex);.    p
12290 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e  File->hMutex = N
122a0 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
122b0 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
122c0 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
122d0 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e  ile() API of Win
122e0 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
122f0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
12300 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
12310 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
12320 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12330 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
12340 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
12350 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
12360 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
12370 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
12380 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
12390 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
123a0 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
123b0 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
123c0 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
123d0 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
123e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
123f0 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
12400 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12410 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
12420 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
12430 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
12440 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
12450 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
12460 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
12470 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
12480 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
12490 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
124a0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
124b0 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
124c0 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
124d0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
124e0 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
124f0 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
12500 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
12510 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
12520 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
12530 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
12540 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
12550 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
12560 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
12570 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
12580 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
12590 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
125a0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
125b0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
125c0 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
125d0 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
125e0 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
125f0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
12600 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
12610 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
12620 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
12630 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
12640 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
12650 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
12660 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
12670 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
12680 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
12690 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
126a0 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
126b0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
126c0 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
126d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
126e0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
126f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
12700 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
12710 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
12720 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
12730 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
12740 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
12750 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
12760 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
12770 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
12780 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
12790 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
127a0 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
127b0 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
127c0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
127d0 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
127e0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
127f0 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
12800 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
12810 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
12820 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
12830 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
12840 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
12850 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
12860 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
12870 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
12880 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
12890 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
128a0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
128b0 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
128c0 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
128d0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
128e0 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20  served == 0) {. 
128f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12900 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
12910 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
12920 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12930 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
12940 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
12950 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
12960 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
12970 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12980 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
12990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d  ;.}../*.** An im
129a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
129b0 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41  the UnlockFile A
129c0 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
129d0 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
129e0 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  OOL winceUnlockF
129f0 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
12a00 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
12a10 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
12a20 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
12a30 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
12a40 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
12a50 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20  sToUnlockLow,.  
12a60 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
12a70 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
12a80 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
12a90 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
12aa0 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
12ab0 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
12ac0 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
12ad0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
12ae0 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
12af0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12b00 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
12b10 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b  esToUnlockHigh);
12b20 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
12b30 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
12b40 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
12b50 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
12b60 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52  hMutex);..  /* R
12b70 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65  eleasing a reade
12b80 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63  r lock or an exc
12b90 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
12ba0 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
12bb0 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
12bc0 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20  HARED_FIRST){.  
12bd0 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65    /* Did we have
12be0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
12bf0 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ck? */.    if (p
12c00 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
12c10 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61  lusive){.      a
12c20 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
12c30 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
12c40 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
12c50 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46  _SIZE);.      pF
12c60 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
12c70 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
12c80 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12c90 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
12ca0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
12cb0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12cc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20    }..    /* Did 
12cd0 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72  we just have a r
12ce0 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  eader lock? */. 
12cf0 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c     else if (pFil
12d00 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
12d10 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  s){.      assert
12d20 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
12d30 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
12d40 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
12d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
12d60 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
12d70 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
12d80 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
12d90 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d  ocal.nReaders --
12da0 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
12db0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
12dc0 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
12dd0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
12de0 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
12df0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
12e00 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
12e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12e20 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65  * Releasing a pe
12e30 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
12e40 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
12e50 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
12e60 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
12e70 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
12e80 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
12e90 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
12ea0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
12eb0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
12ec0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
12ed0 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
12ee0 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
12ef0 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
12f00 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
12f10 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
12f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
12f30 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
12f40 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
12f50 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
12f60 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
12f70 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
12f80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
12f90 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
12fa0 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
12fb0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
12fc0 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
12fd0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
12fe0 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
12ff0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
13000 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
13010 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
13020 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
13030 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
13040 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
13050 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
13060 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
13070 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e  turn;.}./*.** En
13080 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  d of the special
13090 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a   code for wince.
130a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
130f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13100 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  OS_WINCE */../*.
13110 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72  ** Lock a file r
13120 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  egion..*/.static
13130 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c   BOOL winLockFil
13140 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
13150 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c  File,.  DWORD fl
13160 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ags,.  DWORD off
13170 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
13180 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
13190 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
131a0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
131b0 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
131c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
131d0 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
131e0 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
131f0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
13200 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
13210 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
13220 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63  **       API Loc
13230 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
13240 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69  turn winceLockFi
13250 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
13260 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
13270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13280 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
13290 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
132a0 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
132b0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
132c0 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
132d0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
132e0 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
132f0 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
13300 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
13310 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
13320 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
13330 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
13340 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
13350 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67  Ex(*phFile, flag
13360 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  s, 0, numBytesLo
13370 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c  w, numBytesHigh,
13380 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
13390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  {.    return osL
133a0 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
133b0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
133c0 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
133d0 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
133e0 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
133f0 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65  tesHigh);.  }.#e
13400 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  ndif.}../*.** Un
13410 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  lock a file regi
13420 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42  on.. */.static B
13430 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  OOL winUnlockFil
13440 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
13450 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66  File,.  DWORD of
13460 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
13470 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
13480 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
13490 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
134a0 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
134b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
134c0 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
134d0 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
134e0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
134f0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
13500 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
13510 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e   **       API Un
13520 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  lockFile..  */. 
13530 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c   return winceUnl
13540 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
13550 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
13560 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
13590 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
135a0 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  e.  if( osIsNT()
135b0 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
135c0 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d  ED ovlp;.    mem
135d0 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
135e0 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
135f0 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  );.    ovlp.Offs
13600 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a  et = offsetLow;.
13610 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48      ovlp.OffsetH
13620 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68  igh = offsetHigh
13630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55  ;.    return osU
13640 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  nlockFileEx(*phF
13650 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ile, 0, numBytes
13660 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
13670 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
13680 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
13690 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46  sUnlockFile(*phF
136a0 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
136b0 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
136c0 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
136f0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
13700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
13750 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
13760 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  f routines imple
13770 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74  ment the I/O met
13780 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a  hods specified.*
13790 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  * by the sqlite3
137a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
137b0 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ct..************
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  **/../*.** Some 
13810 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c  Microsoft compil
13820 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65  ers lack this de
13830 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  finition..*/.#if
13840 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54  ndef INVALID_SET
13850 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20  _FILE_POINTER.# 
13860 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53  define INVALID_S
13870 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
13880 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64  ((DWORD)-1).#end
13890 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
138a0 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
138b0 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ion of the file 
138c0 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
138d0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
138e0 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
138f0 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
13900 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
13910 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
13920 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  0..** Otherwise,
13930 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74   set pFile->last
13940 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e  Errno and return
13950 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
13960 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b  atic int winSeek
13970 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  File(winFile *pF
13980 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ile, sqlite3_int
13990 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66  64 iOffset){.#if
139a0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
139b0 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69  T.  LONG upperBi
139c0 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
139d0 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e      /* Most sig.
139e0 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
139f0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47  offset */.  LONG
13a00 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20   lowerBits;     
13a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13a20 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69 74  east sig. 32 bit
13a30 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20  s of new offset 
13a40 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74  */.  DWORD dwRet
13a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13a60 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13a70 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c  turned by SetFil
13a80 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20  ePointer() */.  
13a90 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
13ac0 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
13ad0 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43  r() */..  OSTRAC
13ae0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
13af0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22  , offset=%lld\n"
13b00 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66  , pFile->h, iOff
13b10 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42  set));..  upperB
13b20 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f  its = (LONG)((iO
13b30 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
13b40 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65  fffffff);.  lowe
13b50 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69  rBits = (LONG)(i
13b60 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  Offset & 0xfffff
13b70 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20  fff);..  /* API 
13b80 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65  oddity: If succe
13b90 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f  ssful, SetFilePo
13ba0 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20  inter() returns 
13bb0 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e  a dword.  ** con
13bc0 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65  taining the lowe
13bd0 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65  r 32-bits of the
13be0 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74   new file-offset
13bf0 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c  . Or, if it fail
13c00 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72  s,.  ** it retur
13c10 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ns INVALID_SET_F
13c20 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77  ILE_POINTER. How
13c30 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  ever according t
13c40 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56  o MSDN,.  ** INV
13c50 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
13c60 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62  INTER may also b
13c70 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66  e a valid new of
13c80 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65  fset. So to dete
13c90 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68  rmine.  ** wheth
13ca0 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  er an error has 
13cb0 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65  actually occurre
13cc0 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65  d, it is also ne
13cd0 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a  cessary to call.
13ce0 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f    ** GetLastErro
13cf0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65  r()..  */.  dwRe
13d00 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  t = osSetFilePoi
13d10 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c  nter(pFile->h, l
13d20 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72  owerBits, &upper
13d30 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e  Bits, FILE_BEGIN
13d40 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74  );..  if( (dwRet
13d50 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  ==INVALID_SET_FI
13d60 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20  LE_POINTER.     
13d70 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
13d80 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13d90 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20  ())!=NO_ERROR)) 
13da0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
13db0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
13dc0 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
13dd0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
13de0 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c  R_SEEK, pFile->l
13df0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
13e00 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65            "winSe
13e10 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ekFile", pFile->
13e20 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52  zPath);.    OSTR
13e30 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
13e40 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
13e50 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69  ERR_SEEK\n", pFi
13e60 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
13e70 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53  urn 1;.  }..  OS
13e80 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
13e90 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13ea0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
13eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  );.  return 0;.#
13ec0 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53  else.  /*.  ** S
13ed0 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78  ame as above, ex
13ee0 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69  cept that this i
13ef0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f  mplementation wo
13f00 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20  rks for WinRT.. 
13f10 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54   */..  LARGE_INT
13f20 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20  EGER x;         
13f30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
13f40 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f  w offset */.  BO
13f50 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20  OL bRet;        
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f70 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
13f80 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  by SetFilePointe
13f90 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75  rEx() */..  x.Qu
13fa0 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74  adPart = iOffset
13fb0 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74  ;.  bRet = osSet
13fc0 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46  FilePointerEx(pF
13fd0 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49  ile->h, x, 0, FI
13fe0 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66  LE_BEGIN);..  if
13ff0 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69  (!bRet){.    pFi
14000 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14010 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
14020 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
14030 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
14040 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EEK, pFile->last
14050 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
14060 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46         "winSeekF
14070 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ile", pFile->zPa
14080 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  th);.    OSTRACE
14090 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
140a0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
140b0 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  _SEEK\n", pFile-
140c0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
140d0 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41   1;.  }..  OSTRA
140e0 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
140f0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
14100 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
14110 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
14120 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  if.}..#if SQLITE
14130 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
14140 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
14150 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65  rences to VFS he
14160 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65  lper methods use
14170 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70  d for memory map
14180 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61  ped files */.sta
14190 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69  tic int winMapfi
141a0 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c  le(winFile*, sql
141b0 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61  ite3_int64);.sta
141c0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
141d0 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a  file(winFile*);.
141e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
141f0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  ose a file..**.*
14200 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64  * It is reported
14210 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74   that an attempt
14220 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64   to close a hand
14230 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d  le might sometim
14240 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69  es.** fail.  Thi
14250 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65  s is a very unre
14260 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c  asonable result,
14270 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20   but Windows is 
14280 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72  notorious.** for
14290 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61   being unreasona
142a0 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20  ble so I do not 
142b0 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69  doubt that it mi
142c0 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a  ght happen.  If.
142d0 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69  ** the close fai
142e0 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72  ls, we pause for
142f0 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
14300 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
14310 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20    As.** many as 
14320 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
14330 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
14340 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72  se the handle ar
14350 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a  e made before.**
14360 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72   giving up and r
14370 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
14380 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
14390 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33  _CLOSE_ATTEMPT 3
143a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
143b0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
143c0 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
143d0 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e  , cnt = 0;.  win
143e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
143f0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
14400 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
14410 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14420 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74  MIT_WAL.  assert
14430 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30  ( pFile->pShm==0
14440 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
14450 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e  ert( pFile->h!=N
14460 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21  ULL && pFile->h!
14470 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
14480 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41  VALUE );.  OSTRA
14490 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d 25  CE(("CLOSE pid=%
144a0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
144b0 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  le=%p\n",.      
144c0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
144d0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
144e0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
144f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
14500 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
14510 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
14520 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f  e);.#endif..  do
14530 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f  {.    rc = osClo
14540 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
14550 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c  h);.    /* Simul
14560 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30  ateIOError( rc=0
14570 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41  ; cnt=MX_CLOSE_A
14580 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20  TTEMPT; ); */.  
14590 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26  }while( rc==0 &&
145a0 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53   ++cnt < MX_CLOS
145b0 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71  E_ATTEMPT && (sq
145c0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
145d0 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69  p(100), 1) );.#i
145e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
145f0 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f  E.#define WINCE_
14600 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
14610 53 20 33 0a 20 20 7b 0a 20 20 20 20 77 69 6e 56  S 3.  {.    winV
14620 66 73 41 70 70 44 61 74 61 20 2a 70 41 70 70 44  fsAppData *pAppD
14630 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41 70 70  ata = (winVfsApp
14640 44 61 74 61 2a 29 70 46 69 6c 65 2d 3e 70 56 66  Data*)pFile->pVf
14650 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20 20  s->pAppData;.   
14660 20 69 66 28 20 70 41 70 70 44 61 74 61 3d 3d 4e   if( pAppData==N
14670 55 4c 4c 20 7c 7c 20 21 70 41 70 70 44 61 74 61  ULL || !pAppData
14680 2d 3e 62 4e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20  ->bNoLock ){.   
14690 20 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c     winceDestroyL
146a0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
146b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  }.  }.  if( pFil
146c0 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
146d0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
146e0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
146f0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65  .           osDe
14700 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
14710 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
14720 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f  ==0.        && o
14730 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
14740 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  esW(pFile->zDele
14750 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66  teOnClose)!=0xff
14760 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 26  ffffff.        &
14770 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f  & cnt++ < WINCE_
14780 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
14790 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  S.    ){.       
147a0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
147b0 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
147c0 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
147d0 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
147e0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
147f0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
14800 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
14810 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
14820 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
14830 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  le->h = NULL;.  
14840 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  }.  OpenCounter(
14850 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  -1);.  OSTRACE((
14860 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  "CLOSE pid=%lu, 
14870 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
14880 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
14890 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
148a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
148b0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
148c0 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66  , rc ? "ok" : "f
148d0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
148e0 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f  rn rc ? SQLITE_O
148f0 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  K.            : 
14900 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14910 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
14920 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
14930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14940 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14950 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  Close", pFile->z
14960 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
14970 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
14980 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
14990 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
149a0 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
149b0 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
149c0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
149d0 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
149e0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
149f0 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
14a00 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28  tic int winRead(
14a10 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
14a20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *id,          /*
14a30 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72   File to read fr
14a40 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  om */.  void *pB
14a50 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
14a60 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74     /* Write cont
14a70 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ent into this bu
14a80 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  ffer */.  int am
14a90 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
14aa0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14ab0 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
14ac0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
14ad0 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
14ae0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
14af0 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20   at this offset 
14b00 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  */.){.#if !SQLIT
14b10 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
14b20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
14b30 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
14b40 44 29 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20  D).  OVERLAPPED 
14b50 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20  overlapped;     
14b60 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
14b70 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e  et for ReadFile.
14b80 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   */.#endif.  win
14b90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
14ba0 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
14bb0 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
14bc0 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20   DWORD nRead;   
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
14bf0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
14c00 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20  d from file */. 
14c10 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
14c40 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  trys */..  asser
14c50 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
14c60 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
14c70 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
14c80 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
14c90 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
14ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
14cb0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
14cc0 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
14cd0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14ce0 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e  buffer=%p, amoun
14cf0 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  t=%d, ".        
14d00 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c     "offset=%lld,
14d10 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47   lock=%d\n", osG
14d20 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14d30 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20  Id(), pFile,.   
14d40 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
14d50 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
14d60 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
14d70 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
14d80 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
14d90 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
14da0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
14db0 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
14dc0 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
14dd0 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
14de0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
14df0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
14e00 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
14e10 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
14e20 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
14e30 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
14e40 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
14e50 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
14e60 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
14e70 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
14e80 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
14e90 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f  ], amt);.      O
14ea0 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d  STRACE(("READ-MM
14eb0 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AP pid=%lu, pFil
14ec0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
14ed0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
14ef0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14f00 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
14f10 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
14f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14f30 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
14f40 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
14f50 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
14f60 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
14f70 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
14f80 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
14f90 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
14fa0 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29  [offset], nCopy)
14fb0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
14fc0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
14fd0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
14fe0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
14ff0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
15000 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15010 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
15020 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64  WINCE || defined
15030 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
15040 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 69  _OVERLAPPED).  i
15050 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70  f( winSeekFile(p
15060 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b  File, offset) ){
15070 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
15080 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
15090 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
150a0 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
150b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
150c0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
150d0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
150e0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
150f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
15100 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  LL;.  }.  while(
15110 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
15120 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
15130 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a  , &nRead, 0) ){.
15140 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26  #else.  memset(&
15150 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
15160 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
15170 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  ));.  overlapped
15180 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
15190 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
151a0 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70  ffff);.  overlap
151b0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
151c0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
151d0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
151e0 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73  f);.  while( !os
151f0 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
15200 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
15210 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65  Read, &overlappe
15220 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f  d) &&.         o
15230 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21  sGetLastError()!
15240 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f  =ERROR_HANDLE_EO
15250 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  F ){.#endif.    
15260 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
15270 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72  .    if( winRetr
15280 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
15290 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
152a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c  ntinue;.    pFil
152b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
152c0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53  astErrno;.    OS
152d0 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64  TRACE(("READ pid
152e0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
152f0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15300 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22  TE_IOERR_READ\n"
15310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
15320 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15330 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15340 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
15350 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
15360 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  r(SQLITE_IOERR_R
15370 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EAD, pFile->last
15380 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
153a0 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e  inRead", pFile->
153b0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69  zPath);.  }.  wi
153c0 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79  nLogIoerr(nRetry
153d0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69  , __LINE__);.  i
153e0 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29  f( nRead<(DWORD)
153f0 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e  amt ){.    /* Un
15400 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
15410 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
15420 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
15430 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
15440 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d  ar*)pBuf)[nRead]
15450 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b  , 0, amt-nRead);
15460 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
15470 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
15480 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
15490 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
154a0 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a 20  SHORT_READ\n",. 
154b0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
154c0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
154d0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
154e0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
154f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15500 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
15510 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15520 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
15530 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
15540 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
15550 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
15560 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
15570 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
15580 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
15590 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
155a0 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
155b0 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
155c0 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
155d0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
155e0 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
155f0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
15600 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
15610 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57  .static int winW
15620 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
15630 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
15640 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
15650 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f  to write into */
15660 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
15670 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
15680 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20     /* The bytes 
15690 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
156a0 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
156d0 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a  bytes to write *
156e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
156f0 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20  4 offset        
15700 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
15710 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  to the file to b
15720 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20  egin writing at 
15730 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
15740 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15750 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15760 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  if error has occ
15770 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73  urred, else fals
15780 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
15790 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
157a0 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68  *)id;  /* File h
157b0 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
157c0 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
157d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
157e0 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20  mber of retries 
157f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d  */..  assert( am
15800 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
15810 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
15820 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
15830 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15840 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61  WRITE);.  Simula
15850 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
15860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
15870 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  LL);..  OSTRACE(
15880 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
15890 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
158a0 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61  %p, buffer=%p, a
158b0 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20  mount=%d, ".    
158c0 20 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25         "offset=%
158d0 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  lld, lock=%d\n",
158e0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
158f0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15900 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
15910 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
15920 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e   offset, pFile->
15930 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
15940 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15950 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29 20  MMAP_READWRITE) 
15960 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  && SQLITE_MAX_MM
15970 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
15980 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
15990 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
159a0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
159b0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
159c0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
159d0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
159e0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
159f0 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
15a00 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
15a10 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
15a20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
15a30 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
15a40 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
15a50 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
15a60 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
15a70 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  t], pBuf, amt);.
15a80 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
15a90 57 52 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d 25  WRITE-MMAP pid=%
15aa0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15ab0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
15ac0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
15ad0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
15ae0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
15af0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
15b00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
15b30 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
15b40 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
15b50 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
15b60 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
15b70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
15b80 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
15b90 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
15ba0 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
15bb0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
15bc0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
15bd0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
15be0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
15bf0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
15c00 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
15c10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15c20 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
15c30 50 45 44 29 0a 20 20 72 63 20 3d 20 77 69 6e 53  PED).  rc = winS
15c40 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  eekFile(pFile, o
15c50 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
15c60 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b  ==0 ){.#else.  {
15c70 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
15c80 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
15c90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15ca0 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
15cb0 50 45 44 29 0a 20 20 20 20 4f 56 45 52 4c 41 50  PED).    OVERLAP
15cc0 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
15cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66         /* The of
15ce0 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46 69  fset for WriteFi
15cf0 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  le. */.#endif.  
15d00 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38    u8 *aRem = (u8
15d10 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20   *)pBuf;        
15d20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62  /* Data yet to b
15d30 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
15d40 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b   int nRem = amt;
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15d60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
15d70 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  s yet to be writ
15d80 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ten */.    DWORD
15d90 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
15da0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
15db0 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63  s written by eac
15dc0 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61  h WriteFile() ca
15dd0 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  ll */.    DWORD 
15de0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
15df0 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65  RROR;   /* Value
15e00 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74   returned by Get
15e10 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a  LastError() */..
15e20 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
15e30 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
15e40 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
15e50 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20  _OVERLAPPED).   
15e60 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
15e70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
15e80 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
15e90 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
15ea0 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
15eb0 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
15ec0 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
15ed0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
15ee0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
15ef0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
15f00 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69  .#endif..    whi
15f10 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69  le( nRem>0 ){.#i
15f20 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
15f30 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  E || defined(SQL
15f40 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45  ITE_WIN32_NO_OVE
15f50 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20 69  RLAPPED).      i
15f60 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
15f70 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
15f80 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30  nRem, &nWrite, 0
15f90 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ) ){.#else.     
15fa0 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
15fb0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
15fc0 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
15fd0 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b   &overlapped) ){
15fe0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
15ff0 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  if( winRetryIoer
16000 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
16010 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
16020 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
16030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16040 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
16050 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57  0 || nWrite<=(DW
16060 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20  ORD)nRem );.    
16070 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20    if( nWrite==0 
16080 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44  || nWrite>(DWORD
16090 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  )nRem ){.       
160a0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
160b0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
160c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
160d0 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54      }.#if !SQLIT
160e0 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
160f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
16100 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
16110 44 29 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  D).      offset 
16120 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
16130 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
16140 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
16150 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
16160 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
16170 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
16180 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
16190 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
161a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
161b0 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  aRem += nWrite;.
161c0 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57        nRem -= nW
161d0 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rite;.    }.    
161e0 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  if( nRem>0 ){.  
161f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
16200 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
16210 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
16220 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
16230 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20   rc ){.    if(  
16240 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
16250 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  rno==ERROR_HANDL
16260 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20  E_DISK_FULL ).  
16270 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d       || ( pFile-
16280 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
16290 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a  R_DISK_FULL )){.
162a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
162b0 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
162c0 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
162d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
162e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
162f0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
16300 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
16310 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
16320 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
16330 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
16340 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  FULL, pFile->las
16350 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46   "winWrite1", pF
16380 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
16390 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28   }.    OSTRACE((
163a0 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20  "WRITE pid=%lu, 
163b0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
163c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
163d0 52 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20 20  RR_WRITE\n",.   
163e0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
163f0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
16400 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
16410 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
16420 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
16430 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c  ITE_IOERR_WRITE,
16440 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16450 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
16460 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72            "winWr
16470 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ite2", pFile->zP
16480 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
16490 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e     winLogIoerr(n
164a0 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  Retry, __LINE__)
164b0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
164c0 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
164d0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
164e0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
164f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16500 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
16510 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
16520 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
16530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16540 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
16550 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
16560 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
16570 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
16580 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c   winTruncate(sql
16590 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73  ite3_file *id, s
165a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
165b0 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  te){.  winFile *
165c0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
165d0 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68  *)id;  /* File h
165e0 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  andle object */.
165f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16600 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
16610 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16620 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
16630 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  on */.  DWORD la
16640 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65  stErrno;..  asse
16650 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
16660 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
16670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16680 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20  RR_TRUNCATE);.  
16690 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
166a0 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
166b0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73  e=%p, file=%p, s
166c0 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  ize=%lld, lock=%
166d0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
166e0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
166f0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16700 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
16710 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
16720 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
16730 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
16740 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
16750 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
16760 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
16770 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
16780 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
16790 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
167a0 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
167b0 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
167c0 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
167d0 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
167e0 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
167f0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
16800 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
16810 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
16820 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
16830 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
16840 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
16850 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
16860 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
16870 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
16880 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
16890 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
168a0 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
168b0 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
168c0 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
168d0 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70  f( winSeekFile(p
168e0 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
168f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
16900 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
16910 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
16920 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16940 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31     "winTruncate1
16950 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
16960 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d  ;.  }else if( 0=
16970 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  =osSetEndOfFile(
16980 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20  pFile->h) &&.   
16990 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45           ((lastE
169a0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
169b0 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f  Error())!=ERROR_
169c0 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45  USER_MAPPED_FILE
169d0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
169e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
169f0 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
16a00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
16a10 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
16a20 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
16a30 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
16a40 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
16a50 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d  uncate2", pFile-
16a60 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69  >zPath);.  }..#i
16a70 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
16a80 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66  P_SIZE>0.  /* If
16a90 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74 72   the file was tr
16aa0 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a  uncated to a siz
16ab0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
16ac0 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  he currently.  *
16ad0 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c  * mapped region,
16ae0 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
16af0 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69  ctive mapping si
16b00 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69  ze as well. SQLi
16b10 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65  te will.  ** use
16b20 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74   read() and writ
16b30 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61  e() to access da
16b40 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70  ta beyond this p
16b50 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e  oint from now on
16b60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
16b70 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26  le->pMapRegion &
16b80 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  & nByte<pFile->m
16b90 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70  mapSize ){.    p
16ba0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
16bb0 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64   nByte;.  }.#end
16bc0 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
16bd0 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75  TRUNCATE pid=%lu
16be0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
16bf0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
16c00 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
16c10 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
16c20 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
16c30 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
16c40 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
16c50 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
16c60 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
16c70 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
16c80 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
16c90 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
16ca0 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
16cb0 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
16cc0 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
16cd0 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
16ce0 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
16cf0 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
16d00 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
16d10 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
16d20 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
16d30 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
16d40 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
16d50 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
16d60 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
16d70 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
16d80 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
16d90 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65  t winSync(sqlite
16da0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16db0 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20  flags){.#ifndef 
16dc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
16dd0 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e   /*.  ** Used on
16de0 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e  ly when SQLITE_N
16df0 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65  O_SYNC is not de
16e00 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42  fined..   */.  B
16e10 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  OOL rc;.#endif.#
16e20 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
16e30 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  UG) || !defined(
16e40 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20  SQLITE_NO_SYNC) 
16e50 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64  || \.    defined
16e60 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f  (SQLITE_HAVE_OS_
16e70 54 52 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a  TRACE).  /*.  **
16e80 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54   Used when SQLIT
16e90 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
16ea0 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20   defined and by 
16eb0 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64  the assert() and
16ec0 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45  /or.  ** OSTRACE
16ed0 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f  () macros..   */
16ee0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16ef0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16f00 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
16f10 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
16f20 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
16f30 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20  ( pFile );.  /* 
16f40 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
16f50 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
16f60 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
16f70 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
16f80 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
16f90 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
16fa0 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
16fb0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
16fc0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
16fd0 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
16fe0 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
16ff0 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
17000 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
17010 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
17020 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
17030 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
17040 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
17050 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
17060 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
17070 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
17080 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
17090 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ..  OSTRACE(("SY
170a0 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  NC pid=%lu, pFil
170b0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66  e=%p, file=%p, f
170c0 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64  lags=%x, lock=%d
170d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
170e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
170f0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
17100 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c  pFile->h, flags,
17110 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17120 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
17130 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
17140 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
17150 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
17160 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
17170 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
17180 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
17190 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
171a0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
171b0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
171c0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
171d0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
171e0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
171f0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
17200 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
17210 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
17220 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17230 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41  _NO_SYNC.  OSTRA
17240 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69  CE(("SYNC-NOP pi
17250 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
17260 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
17270 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
17280 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
17290 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
172a0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
172b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
172c0 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69 66 20  E_OK;.#else.#if 
172d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
172e0 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
172f0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  le->pMapRegion )
17300 7b 0a 20 20 20 20 69 66 28 20 6f 73 46 6c 75 73  {.    if( osFlus
17310 68 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  hViewOfFile(pFil
17320 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 30  e->pMapRegion, 0
17330 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  ) ){.      OSTRA
17340 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70  CE(("SYNC-MMAP p
17350 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
17360 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c  , pMapRegion=%p,
17370 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
17380 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c    "rc=SQLITE_OK\
17390 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
173a0 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20  ProcessId(),.   
173b0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
173c0 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  e, pFile->pMapRe
173d0 67 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 65 6c 73  gion));.    }els
173e0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
173f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17400 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
17410 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59      OSTRACE(("SY
17420 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  NC-MMAP pid=%lu,
17430 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52   pFile=%p, pMapR
17440 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
17450 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53             "rc=S
17460 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
17470 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e  \n", osGetCurren
17480 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20  tProcessId(),.  
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
174a0 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  le, pFile->pMapR
174b0 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72  egion));.      r
174c0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
174d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
174e0 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  MAP, pFile->last
174f0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 22 77 69 6e 53 79 6e 63 31 22 2c 20 70 46 69 6c  "winSync1", pFil
17520 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
17530 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63  .  }.#endif.  rc
17540 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75   = osFlushFileBu
17550 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b  ffers(pFile->h);
17560 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17570 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a  or( rc=FALSE );.
17580 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17590 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70  OSTRACE(("SYNC p
175a0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
175b0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
175c0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
175d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
175e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
175f0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
17600 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
17610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
17620 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
17630 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
17640 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
17650 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
17660 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
17670 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
17680 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
17690 43 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  C\n",.          
176a0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
176b0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
176c0 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
176d0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
176e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
176f0 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d  RR_FSYNC, pFile-
17700 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 20 22 77 69 6e 53 79 6e 63 32 22 2c 20 70     "winSync2", p
17730 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
17740 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
17750 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
17760 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
17770 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
17780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17790 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
177a0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
177b0 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
177c0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
177d0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
177e0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
177f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
17800 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
17810 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30  assert( pSize!=0
17820 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
17830 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
17840 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
17850 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  ;.  OSTRACE(("SI
17860 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
17870 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  e=%p\n", pFile->
17880 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66  h, pSize));..#if
17890 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
178a0 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54  .  {.    FILE_ST
178b0 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f  ANDARD_INFO info
178c0 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46  ;.    if( osGetF
178d0 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
178e0 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e  HandleEx(pFile->
178f0 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49  h, FileStandardI
17900 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c            &info,
17930 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29   sizeof(info)) )
17940 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
17950 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e   info.EndOfFile.
17960 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65  QuadPart;.    }e
17970 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
17980 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
17990 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
179a0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
179b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
179c0 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
179d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65      "winFileSize
17a00 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
17a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
17a20 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
17a30 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44  upperBits;.    D
17a40 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a  WORD lowerBits;.
17a50 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
17a60 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42  rno;..    lowerB
17a70 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53  its = osGetFileS
17a80 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
17a90 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a  pperBits);.    *
17aa0 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
17ab0 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
17ac0 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
17ad0 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20  Bits;.    if(   
17ae0 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e  (lowerBits == IN
17af0 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29  VALID_FILE_SIZE)
17b00 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  .       && ((las
17b10 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17b20 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
17b30 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70  RROR) ){.      p
17b40 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
17b50 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
17b60 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
17b70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
17b80 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
17b90 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
17bc0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
17bd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
17be0 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
17bf0 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
17c00 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c  %p, *pSize=%lld,
17c10 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
17c20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
17c30 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73  pSize, *pSize, s
17c40 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17c50 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
17c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46  ;.}../*.** LOCKF
17c70 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
17c80 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65  TELY is undefine
17c90 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77  d on some Window
17ca0 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  s systems..*/.#i
17cb0 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46  fndef LOCKFILE_F
17cc0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a  AIL_IMMEDIATELY.
17cd0 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
17ce0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
17cf0 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  LY 1.#endif..#if
17d00 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  ndef LOCKFILE_EX
17d10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64  CLUSIVE_LOCK.# d
17d20 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45  efine LOCKFILE_E
17d30 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a  XCLUSIVE_LOCK 2.
17d40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69  #endif../*.** Hi
17d50 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69  storically, SQLi
17d60 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74 68  te has used both
17d70 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e   the LockFile an
17d80 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  d LockFileEx fun
17d90 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20  ctions..** When 
17da0 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e  the LockFile fun
17db0 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20  ction was used, 
17dc0 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65 78  it was always ex
17dd0 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a  pected to fail.*
17de0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66  * immediately if
17df0 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20   the lock could 
17e00 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
17e10 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79    Also, it alway
17e20 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a  s expected to.**
17e30 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75   obtain an exclu
17e40 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73  sive lock.  Thes
17e50 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65 64  e flags are used
17e60 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69   with the LockFi
17e70 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  leEx function.**
17e80 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f   and reflect tho
17e90 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b  se expectations;
17ea0 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79   therefore, they
17eb0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
17ec0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  hanged..*/.#ifnd
17ed0 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ef SQLITE_LOCKFI
17ee0 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  LE_FLAGS.# defin
17ef0 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
17f00 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46  E_FLAGS   (LOCKF
17f10 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
17f20 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20  TELY | \.       
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46             LOCKF
17f50 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
17f60 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  CK).#endif../*.*
17f70 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c  * Currently, SQL
17f80 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20  ite never calls 
17f90 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
17fa0 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
17fb0 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  wanting the.** c
17fc0 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65  all to fail imme
17fd0 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
17fe0 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
17ff0 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  tained..*/.#ifnd
18000 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ef SQLITE_LOCKFI
18010 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66  LEEX_FLAGS.# def
18020 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
18030 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43  ILEEX_FLAGS (LOC
18040 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
18050 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a  IATELY).#endif..
18060 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
18070 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20  reader lock..** 
18080 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f  Different API ro
18090 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65  utines are calle
180a0 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  d depending on w
180b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
180c0 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f  is.** is Win9x o
180d0 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74  r WinNT..*/.stat
180e0 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61  ic int winGetRea
180f0 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
18100 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
18110 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
18120 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  AD-LOCK file=%p,
18130 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
18140 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
18150 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20  cktype));.  if( 
18160 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
18170 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
18180 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
18190 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
181a0 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
181b0 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
181c0 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
181d0 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20  in32.    **     
181e0 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78    API LockFileEx
181f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73  ..    */.    res
18200 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65   = winceLockFile
18210 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
18220 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20  ED_FIRST, 0, 1, 
18230 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65  0);.#else.    re
18240 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
18250 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
18260 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
18270 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
18280 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
18290 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
182a0 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64  D_SIZE, 0);.#end
182b0 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
182c0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
182d0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
182e0 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69  int lk;.    sqli
182f0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
18300 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b  izeof(lk), &lk);
18310 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
18320 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68  edLockByte = (sh
18330 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66  ort)((lk & 0x7ff
18340 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
18350 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72  IZE - 1));.    r
18360 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
18370 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
18380 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
18390 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
183a0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
183b0 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
183c0 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
183d0 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
183e0 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30  f.  if( res == 0
183f0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
18400 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
18410 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
18420 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c   /* No need to l
18430 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20  og a failure to 
18440 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53  lock */.  }.  OS
18450 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
18460 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
18470 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%d\n", pFile->
18480 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75  h, res));.  retu
18490 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
184a0 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
184b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
184c0 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
184d0 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
184e0 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44  {.  int res;.  D
184f0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
18500 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
18510 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  -UNLOCK file=%p,
18520 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
18530 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
18540 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20  cktype));.  if( 
18550 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
18560 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
18570 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
18580 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
18590 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
185a0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
185b0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
185c0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65  I.  else{.    re
185d0 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
185e0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
185f0 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
18600 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
18610 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
18620 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d  endif.  if( res=
18630 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e  =0 && ((lastErrn
18640 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
18650 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54  or())!=ERROR_NOT
18660 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20  _LOCKED) ){.    
18670 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
18680 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
18690 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
186a0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
186b0 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
186c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
186d0 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52       "winUnlockR
186e0 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  eadLock", pFile-
186f0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f  >zPath);.  }.  O
18700 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e  STRACE(("READ-UN
18710 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
18720 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  sult=%d\n", pFil
18730 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72  e->h, res));.  r
18740 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
18750 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
18760 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
18770 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
18780 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
18790 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
187a0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
187b0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
187c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
187d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
187e0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
187f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
18800 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
18810 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
18820 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
18830 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
18840 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
18850 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
18860 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
18870 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
18880 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
18890 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
188a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
188b0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
188c0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
188d0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
188e0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
188f0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
18900 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
18910 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
18920 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
18930 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
18940 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
18950 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
18960 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
18970 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
18980 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
18990 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
189a0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
189b0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
189c0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
189d0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
189e0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
189f0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
18a00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18a10 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
18a20 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
18a30 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
18a40 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
18a50 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
18a60 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
18a70 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
18a80 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
18a90 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
18aa0 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
18ab0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18ac0 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
18ad0 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
18ae0 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
18af0 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
18b00 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
18b10 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
18b20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18b30 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
18b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18b50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
18b60 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
18b70 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
18b80 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
18b90 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
18ba0 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
18bb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
18bc0 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
18bd0 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
18be0 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
18bf0 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
18c00 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
18c10 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
18c20 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
18c30 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
18c40 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
18c50 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
18c60 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
18c70 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
18c80 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
18c90 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
18ca0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
18cb0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
18cc0 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
18cd0 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
18ce0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
18cf0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18d00 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
18d10 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
18d20 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
18d30 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
18d40 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
18d50 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
18d60 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
18d70 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
18d80 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
18d90 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
18da0 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
18db0 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
18dc0 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
18dd0 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
18de0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
18df0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
18e00 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
18e10 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20  ACE(("LOCK-HELD 
18e20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
18e30 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
18e40 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
18e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
18e60 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c  .  /* Do not all
18e70 6f 77 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 77  ow any kind of w
18e80 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite-lock on a r
18e90 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
18ea0 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  e.  */.  if( (pF
18eb0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
18ec0 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29   WINFILE_RDONLY)
18ed0 21 3d 30 20 26 26 20 6c 6f 63 6b 74 79 70 65 3e  !=0 && locktype>
18ee0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
18ef0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18f00 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
18f10 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
18f20 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
18f30 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
18f40 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
18f50 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
18f60 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
18f70 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
18f80 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
18f90 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
18fa0 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
18fb0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
18fc0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
18fd0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18fe0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
18ff0 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
19000 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
19010 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
19020 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  acquire a PENDIN
19030 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61  G lock or.  ** a
19040 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49   SHARED lock.  I
19050 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69  f we are acquiri
19060 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
19070 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f  , the acquisitio
19080 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45  n of.  ** the PE
19090 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
190a0 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20  is temporary..  
190b0 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  */.  newLocktype
190c0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
190d0 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  pe;.  if( pFile-
190e0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
190f0 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79  CK.   || (lockty
19100 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
19110 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
19120 6b 74 79 70 65 3c 3d 52 45 53 45 52 56 45 44 5f  ktype<=RESERVED_
19130 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
19140 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20  nt cnt = 3;.    
19150 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26  while( cnt-->0 &
19160 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b  & (res = winLock
19170 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
19180 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
19190 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
191d0 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
191e0 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d      /* Try 3 tim
191f0 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65  es to get the pe
19200 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69  nding lock.  Thi
19210 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77  s is needed to w
19220 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f  ork.      ** aro
19230 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
19240 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20  sed by indexing 
19250 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75  and/or anti-viru
19260 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20  s software on.  
19270 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73      ** Windows s
19280 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a  ystems..      **
19290 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e   If you are usin
192a0 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61  g this code as a
192b0 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72   model for alter
192c0 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f  native VFSes, do
192d0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   not.      ** co
192e0 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f  py this retry lo
192f0 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61  gic.  It is a ha
19300 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  ck intended for 
19310 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20  Windows only..  
19320 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73      */.      las
19330 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
19340 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
19350 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
19360 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c  PENDING-FAIL fil
19370 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
19380 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20  result=%d\n",.  
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
193a0 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29  le->h, cnt, res)
193b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
193c0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e  tErrno==ERROR_IN
193d0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a  VALID_HANDLE ){.
193e0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
193f0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
19400 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
19410 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
19420 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53  LOCK;.        OS
19430 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49  TRACE(("LOCK-FAI
19440 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
19450 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19470 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73  pFile->h, cnt, s
19480 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
19490 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
194a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
194b0 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20        if( cnt ) 
194c0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
194d0 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
194e0 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
194f0 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20   = res;.    if( 
19500 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61  !res ){.      la
19510 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
19520 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
19530 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
19540 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ire a shared loc
19550 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
19560 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
19570 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
19580 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
19590 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
195a0 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
195b0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
195c0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
195d0 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
195e0 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
195f0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
19600 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
19610 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
19620 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
19630 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
19640 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
19650 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
19660 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
19670 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
19680 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
19690 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
196a0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
196b0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
196c0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
196d0 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
196e0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
196f0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
19700 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
19710 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
19720 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
19730 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
19740 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
19750 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
19760 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
19770 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
19780 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
19790 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
197a0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
197b0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
197c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
197d0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
197e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
197f0 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
19800 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
19810 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
19820 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
19830 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
19840 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
19850 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
19860 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
19870 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
19880 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d  File);.    res =
19890 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
198a0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
198b0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53  OCKFILE_FLAGS, S
198c0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
198f0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
19900 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
19910 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
19920 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
19930 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
19940 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
19950 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
19960 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
19970 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
19980 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
19990 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
199a0 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
199b0 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
199c0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
199d0 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
199e0 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
199f0 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
19a00 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
19a10 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
19a20 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
19a30 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
19a40 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
19a50 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
19a60 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
19a70 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
19a80 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
19a90 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
19aa0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
19ab0 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
19ac0 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
19ad0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
19ae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19af0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
19b00 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
19b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
19b20 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  Y;.    OSTRACE((
19b30 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d  "LOCK-FAIL file=
19b40 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67  %p, wanted=%d, g
19b50 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot=%d\n",.      
19b60 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
19b70 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
19b80 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20  cktype));.  }.  
19b90 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
19ba0 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
19bb0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  e;.  OSTRACE(("L
19bc0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
19bd0 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
19be0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19bf0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
19c00 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
19c10 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
19c20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19c30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
19c40 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
19c50 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
19c60 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
19c70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
19c80 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
19c90 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
19ca0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
19cb0 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
19cc0 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
19cd0 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
19ce0 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
19cf0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
19d00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19d10 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
19d20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69  int res;.  winFi
19d30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
19d40 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
19d50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
19d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19d70 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
19d80 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  OCK; );.  OSTRAC
19d90 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
19da0 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
19db0 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%p\n", pFile->
19dc0 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  h, pResOut));.. 
19dd0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
19de0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
19df0 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
19e00 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
19e10 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  s = 1;.    OSTRA
19e20 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
19e30 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
19e40 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  t=%d (local)\n",
19e50 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
19e60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
19e70 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
19e80 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
19e90 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
19ea0 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54  AGS,RESERVED_BYT
19eb0 45 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 69 66  E,0,1,0);.    if
19ec0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 77  ( res ){.      w
19ed0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
19ee0 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
19ef0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
19f00 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73 20 3d  .    }.    res =
19f10 20 21 72 65 73 3b 0a 20 20 20 20 4f 53 54 52 41   !res;.    OSTRA
19f20 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
19f30 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
19f40 74 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22  t=%d (remote)\n"
19f50 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29  , pFile->h, res)
19f60 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
19f70 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52 41  t = res;.  OSTRA
19f80 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
19f90 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
19fa0 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d  ut=%p, *pResOut=
19fb0 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %d, rc=SQLITE_OK
19fc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19fd0 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75  pFile->h, pResOu
19fe0 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20  t, *pResOut));. 
19ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a000 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  K;.}../*.** Lowe
1a010 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
1a020 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
1a030 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
1a040 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
1a050 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
1a060 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
1a070 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
1a080 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1a090 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1a0a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1a0b0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1a0c0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
1a0d0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
1a0e0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
1a0f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1a100 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
1a110 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
1a120 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
1a130 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1a140 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
1a150 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
1a160 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1a170 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e  SHARED_LOCK then
1a180 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1a190 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
1a1a0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73  LITE_IOERR;.*/.s
1a1b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
1a1c0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1a1d0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
1a1e0 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b  pe){.  int type;
1a1f0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
1a200 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
1a210 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a220 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1a230 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
1a240 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
1a250 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
1a260 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
1a270 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
1a280 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
1a290 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
1a2a0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
1a2b0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
1a2c0 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
1a2d0 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
1a2e0 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
1a2f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
1a300 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
1a310 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
1a320 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
1a330 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
1a340 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
1a350 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
1a360 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
1a370 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69  ARED_LOCK && !wi
1a380 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
1a390 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
1a3a0 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
1a3b0 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
1a3c0 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
1a3d0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
1a3e0 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
1a3f0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
1a400 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1a410 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
1a420 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74  NLOCK, osGetLast
1a430 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
1a460 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1a470 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
1a480 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
1a490 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
1a4a0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
1a4b0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
1a4c0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
1a4d0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
1a4e0 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
1a4f0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
1a500 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
1a510 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
1a520 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
1a530 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  NG_LOCK ){.    w
1a540 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
1a550 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
1a560 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
1a570 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
1a580 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
1a590 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
1a5a0 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
1a5b0 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73  , lock=%d, rc=%s
1a5c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1a5d0 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
1a5e0 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74  >locktype, sqlit
1a5f0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a610 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1a620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a660 0a 2a 2a 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 20  *************** 
1a680 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
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 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
1a6c0 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
1a6d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
1a6e0 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
1a6f0 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
1a700 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
1a710 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
1a720 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
1a730 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
1a740 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
1a750 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
1a760 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
1a770 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
1a780 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
1a790 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
1a7a0 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
1a7b0 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
1a7c0 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
1a7d0 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
1a7e0 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
1a7f0 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
1a800 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
1a810 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
1a820 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
1a830 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
1a840 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
1a850 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
1a860 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
1a870 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
1a880 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a890 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
1a8a0 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
1a8b0 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
1a8c0 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
1a8d0 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
1a8e0 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
1a8f0 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
1a900 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
1a910 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1a920 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
1a930 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
1a940 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
1a950 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
1a960 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
1a970 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
1a980 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
1a990 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b  ic int winNolock
1a9a0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1a9b0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
1a9c0 79 70 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ype){.  UNUSED_P
1a9d0 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20  ARAMETER(id);.  
1a9e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a9f0 28 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72 65  (locktype);.  re
1aa00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1aa10 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  }..static int wi
1aa20 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  nNolockCheckRese
1aa30 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
1aa40 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
1aa50 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
1aa60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
1aa70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1aa80 45 54 45 52 28 70 52 65 73 4f 75 74 29 3b 0a 20  ETER(pResOut);. 
1aa90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1aaa0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1aab0 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b   winNolockUnlock
1aac0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1aad0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
1aae0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1aaf0 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55 53  ETER(id);.  UNUS
1ab00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f 63  ED_PARAMETER(loc
1ab10 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  ktype);.  return
1ab20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab40 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
1ab50 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  o-op lock implem
1ab60 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1abd0 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1abe0 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61  s initially nega
1abf0 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1ac00 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1ac10 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1ac20 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1ac30 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1ac40 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1ac50 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1ac60 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1ac70 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1ac80 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1ac90 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1aca0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1acb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1acc0 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46   winModeBit(winF
1acd0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
1ace0 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
1acf0 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
1ad00 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
1ad10 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
1ad20 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
1ad30 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
1ad40 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
1ad50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1ad60 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
1ad70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1ad80 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1ad90 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
1ada0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1adb0 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65  ces to VFS helpe
1adc0 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66  r methods used f
1add0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1ade0 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
1adf0 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
1ae00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63  sqlite3_vfs *, c
1ae10 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20  har **);.static 
1ae20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e  int winIsDir(con
1ae30 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74  st void *);.stat
1ae40 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69  ic BOOL winIsDri
1ae50 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
1ae60 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a  (const char *);.
1ae70 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61  ./*.** Control a
1ae80 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  nd query of the 
1ae90 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1aea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aeb0 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  winFileControl(s
1aec0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1aed0 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1aee0 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  Arg){.  winFile 
1aef0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
1af00 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45  e*)id;.  OSTRACE
1af10 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1af20 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70  , op=%d, pArg=%p
1af30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f  \n", pFile->h, o
1af40 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69  p, pArg));.  swi
1af50 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1af60 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1af70 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
1af80 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1af90 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
1afa0 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  e;.      OSTRACE
1afb0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1afc0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1afd0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1afe0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1aff0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1b000 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b010 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TL_LAST_ERRNO: {
1b020 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1b030 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
1b040 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
1b050 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1b060 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1b070 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
1b080 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1b090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b0a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1b0b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
1b0c0 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
1b0d0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
1b0e0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
1b0f0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b100 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b110 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1b120 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1b130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b140 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1b150 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1b160 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
1b170 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1b180 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
1b190 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b1a0 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69  oldSz;.        i
1b1b0 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53  nt rc = winFileS
1b1c0 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b  ize(id, &oldSz);
1b1d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1b1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b1f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b200 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28  int64 newSz = *(
1b210 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
1b220 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Arg;.          i
1b230 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29  f( newSz>oldSz )
1b240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  {.            Si
1b250 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b260 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1b270 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
1b280 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
1b290 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
1b2a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1b2b0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(0);.         
1b2c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b2d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b2e0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b2f0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
1b300 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1b310 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
1b320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b330 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
1b340 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1b350 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1b360 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b370 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b380 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1b390 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b3a0 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1b3b0 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
1b3c0 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
1b3d0 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
1b3e0 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
1b3f0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1b400 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1b410 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
1b420 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1b430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b440 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1b450 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
1b460 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
1b470 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
1b480 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
1b490 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
1b4a0 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Arg);.      OSTR
1b4b0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1b4c0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1b4d0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
1b4e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b4f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b500 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b510 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
1b520 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
1b530 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
1b540 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
1b550 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
1b560 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1b570 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1b580 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1b590 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1b5a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b5b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1b5c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1b5d0 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
1b5e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
1b5f0 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
1b600 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
1b610 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f  ){.        winIo
1b620 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b  errRetry = a[0];
1b630 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b640 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e        a[0] = win
1b650 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20  IoerrRetry;.    
1b660 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b    }.      if( a[
1b670 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1]>0 ){.        
1b680 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
1b690 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  ay = a[1];.     
1b6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b6b0 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52  a[1] = winIoerrR
1b6c0 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20  etryDelay;.     
1b6d0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
1b6e0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1b6f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1b700 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b720 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1b730 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b740 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41 4e  TL_WIN32_GET_HAN
1b750 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48  DLE: {.      LPH
1b760 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20 28  ANDLE phFile = (
1b770 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20  LPHANDLE)pArg;. 
1b780 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 70       *phFile = p
1b790 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 4f  File->h;.      O
1b7a0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1b7b0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1b7c0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
1b7d0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
1b7e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1b7f0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1b800 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65 20 53  _TEST.    case S
1b810 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
1b820 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a  2_SET_HANDLE: {.
1b830 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 70        LPHANDLE p
1b840 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c  hFile = (LPHANDL
1b850 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20 48 41  E)pArg;.      HA
1b860 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20  NDLE hOldFile = 
1b870 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20  pFile->h;.      
1b880 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69  pFile->h = *phFi
1b890 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c  le;.      *phFil
1b8a0 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20  e = hOldFile;.  
1b8b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b8c0 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20  NTL oldFile=%p, 
1b8d0 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  newFile=%p, rc=S
1b8e0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 68 4f 6c 64              hOld
1b900 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
1b910 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b920 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b930 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1b940 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d  SQLITE_FCNTL_TEM
1b950 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20  PFILENAME: {.   
1b960 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20     char *zTFile 
1b970 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
1b980 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  c = winGetTempna
1b990 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20  me(pFile->pVfs, 
1b9a0 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  &zTFile);.      
1b9b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b9c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  K ){.        *(c
1b9d0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46  har**)pArg = zTF
1b9e0 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
1b9f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1ba00 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
1ba10 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
1ba20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1ba30 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
1ba40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66  rn rc;.    }.#if
1ba50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1ba60 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65  _SIZE>0.    case
1ba70 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
1ba80 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
1ba90 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20   i64 newLimit = 
1baa0 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  *(i64*)pArg;.   
1bab0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
1bac0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
1bad0 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65   newLimit>sqlite
1bae0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1baf0 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Mmap ){.        
1bb00 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  newLimit = sqlit
1bb10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1bb20 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a  xMmap;.      }..
1bb30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
1bb40 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d  ue of newLimit m
1bb50 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ay be eventually
1bb60 20 63 61 73 74 20 74 6f 20 28 53 49 5a 45 5f 54   cast to (SIZE_T
1bb70 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20  ) and passed.   
1bb80 20 20 20 2a 2a 20 74 6f 20 4d 61 70 56 69 65 77     ** to MapView
1bb90 4f 66 46 69 6c 65 28 29 2e 20 52 65 73 74 72 69  OfFile(). Restri
1bba0 63 74 20 69 74 73 20 76 61 6c 75 65 20 74 6f 20  ct its value to 
1bbb0 32 47 42 20 69 66 20 28 53 49 5a 45 5f 54 29 20  2GB if (SIZE_T) 
1bbc0 69 73 20 6e 6f 74 20 61 74 0a 20 20 20 20 20 20  is not at.      
1bbd0 2a 2a 20 6c 65 61 73 74 20 61 20 36 34 2d 62 69  ** least a 64-bi
1bbe0 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 20  t type. */.     
1bbf0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 30 20   if( newLimit>0 
1bc00 26 26 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54  && sizeof(SIZE_T
1bc10 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  )<8 ){.        n
1bc20 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77 4c 69  ewLimit = (newLi
1bc30 6d 69 74 20 26 20 30 78 37 46 46 46 46 46 46 46  mit & 0x7FFFFFFF
1bc40 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1bc50 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
1bc60 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1bc70 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
1bc80 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
1bc90 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
1bca0 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
1bcb0 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
1bcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1bcd0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
1bce0 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
1bcf0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
1bd00 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
1bd10 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69        winUnmapfi
1bd20 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
1bd30 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70       rc = winMap
1bd40 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b  file(pFile, -1);
1bd50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bd60 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
1bd70 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1bd80 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
1bd90 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
1bda0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1bdb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1bdc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1bdd0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1bde0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1bdf0 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20  TE_NOTFOUND\n", 
1be00 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
1be10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1be20 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1be30 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1be40 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1be50 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1be60 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1be70 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1be80 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1be90 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1bea0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1beb0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1bec0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1bed0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1bee0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1bef0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1bf00 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1bf10 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1bf20 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1bf30 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1bf40 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1bf50 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1bf60 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1bf70 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1bf80 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1bf90 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1bfa0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1bfb0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
1bfc0 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
1bfd0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1bfe0 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
1bff0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c000 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1c010 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
1c020 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
1c030 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
1c040 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
1c050 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
1c060 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1c070 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1c080 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
1c090 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
1c0a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c0b0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
1c0c0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
1c0d0 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
1c0e0 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
1c0f0 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
1c100 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1c110 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f  ERWRITE:0);.}../
1c120 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c  *.** Windows wil
1c130 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
1c140 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
1c150 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
1c160 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
1c170 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
1c180 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
1c190 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1c1a0 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
1c1b0 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
1c1c0 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
1c1d0 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  rity size..*/.st
1c1e0 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f  atic SYSTEM_INFO
1c1f0 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
1c200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c210 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
1c220 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
1c230 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
1c240 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
1c250 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
1c260 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
1c270 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
1c280 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
1c290 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 0a  objects used by.
1c2a0 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
1c2b0 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
1c2c0 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
1c2d0 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
1c2e0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
1c2f0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
1c300 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
1c310 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
1c320 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68  al mutex.** is h
1c330 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
1c340 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
1c350 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
1c360 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
1c370 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e  ).** statements.
1c380 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69   e.g..**.**   wi
1c390 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1c3a0 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
1c3b0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1c3c0 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ) );.**   winShm
1c3d0 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a  LeaveMutex().*/.
1c3e0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1c3f0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  hmEnterMutex(voi
1c400 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1c410 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1c420 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1c430 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1c440 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63  VFS1));.}.static
1c450 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76   void winShmLeav
1c460 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
1c470 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1c480 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
1c490 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1c4a0 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29  EX_STATIC_VFS1))
1c4b0 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ;.}.#ifndef NDEB
1c4c0 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  UG.static int wi
1c4d0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f  nShmMutexHeld(vo
1c4e0 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
1c4f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c500 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
1c510 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1c520 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a  _STATIC_VFS1));.
1c530 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c540 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
1c550 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
1c560 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
1c570 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
1c580 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
1c590 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
1c5a0 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
1c5b0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
1c5c0 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
1c5d0 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
1c5e0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
1c5f0 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
1c600 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
1c610 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
1c620 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1c630 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
1c640 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
1c650 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
1c660 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
1c670 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
1c680 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
1c690 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
1c6a0 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
1c6b0 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
1c6c0 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
1c6d0 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1c6e0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
1c6f0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
1c700 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
1c710 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a  **      pNext.**
1c720 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1c730 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
1c740 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
1c750 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1c760 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ed:.**.**      f
1c770 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
1c780 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
1c790 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
1c7a0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
1c7b0 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
1c7c0 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
1c7d0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
1c7e0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
1c7f0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
1c800 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
1c810 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
1c820 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
1c830 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
1c840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
1c850 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
1c860 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
1c870 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
1c880 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1c890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1c8a0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
1c8b0 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
1c8c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1c8d0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
1c8e0 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
1c8f0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
1c900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c910 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
1c920 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
1c930 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c950 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
1c960 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69  Region */.  u8 i
1c970 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20  sReadonly;      
1c980 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c990 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  f read-only */. 
1c9a0 20 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20   u8 isUnlocked; 
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c9c0 72 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f  rue if no DMS lo
1c9d0 63 6b 20 68 65 6c 64 20 2a 2f 0a 0a 20 20 73 74  ck held */..  st
1c9e0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
1c9f0 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
1ca00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ca10 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
1ca20 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
1ca30 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
1ca40 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
1ca50 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
1ca60 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
1ca70 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
1ca80 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
1ca90 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1caa0 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cac0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
1cad0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1cae0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1caf0 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
1cb00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cb10 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
1cb20 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1cb30 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
1cb40 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
1cb50 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
1cb60 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
1cb70 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
1cb80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1cb90 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1cba0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
1cbb0 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38  E_OS_TRACE).  u8
1cbc0 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
1cbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1cbe0 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68   available winSh
1cbf0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1cc00 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
1cc10 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66   global array of
1cc20 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
1cc30 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  objects..**.** T
1cc40 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  he winShmMutexHe
1cc50 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1cc60 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  e while reading 
1cc70 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  or writing this 
1cc80 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1cc90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53  winShmNode *winS
1cca0 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  hmNodeList = 0;.
1ccb0 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
1ccc0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
1ccd0 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
1cce0 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
1ccf0 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
1cd00 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
1cd10 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
1cd20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1cd30 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
1cd40 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
1cd50 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
1cd60 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
1cd70 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
1cd80 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  .**.**    winShm
1cd90 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20  .pShmNode.**    
1cda0 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  winShm.id.**.** 
1cdb0 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
1cdc0 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
1cdd0 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68    The winShm.pSh
1cde0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73  mNode->mutex mus
1cdf0 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
1ce00 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
1ce10 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
1ce20 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ds..*/.struct wi
1ce30 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e  nShm {.  winShmN
1ce40 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1ce50 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
1ce60 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  lying winShmNode
1ce70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e   object */.  win
1ce80 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
1ce90 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1cea0 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20  winShm with the 
1ceb0 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20  same winShmNode 
1cec0 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
1ced0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cee0 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
1cef0 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  ng the winShmNod
1cf00 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36  e mutex */.  u16
1cf10 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
1cf20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1cf30 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
1cf40 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
1cf50 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
1cf60 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1cf70 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1cf80 68 65 6c 64 20 2a 2f 0a 23 69 66 20 64 65 66 69  held */.#if defi
1cf90 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1cfa0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1cfb0 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
1cfc0 45 29 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  E).  u8 id;     
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfe0 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
1cff0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
1d000 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
1d010 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
1d020 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
1d030 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
1d040 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
1d050 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
1d060 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
1d070 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
1d080 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
1d090 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
1d0a0 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
1d0b0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
1d0c0 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
1d0d0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
1d0e0 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
1d0f0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
1d100 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
1d110 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
1d120 69 6e 65 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  ine WINSHM_UNLCK
1d130 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 53    1.#define WINS
1d140 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
1d150 69 6e 65 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b  ine WINSHM_WRLCK
1d160 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
1d170 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1d180 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1d190 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
1d1a0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
1d1b0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
1d1c0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
1d1d0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
1d1e0 20 20 20 20 20 20 2f 2a 20 57 49 4e 53 48 4d 5f        /* WINSHM_
1d1f0 55 4e 4c 43 4b 2c 20 57 49 4e 53 48 4d 5f 52 44  UNLCK, WINSHM_RD
1d200 4c 43 4b 2c 20 6f 72 20 57 49 4e 53 48 4d 5f 57  LCK, or WINSHM_W
1d210 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
1d220 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1d230 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
1d240 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
1d250 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
1d260 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
1d270 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d280 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
1d290 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
1d2a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1d2b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1d2c0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
1d2d0 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45  Lock/UnlockFileE
1d2e0 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  x() */..  /* Acc
1d2f0 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68  ess to the winSh
1d300 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1d310 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1d320 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1d330 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d340 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
1d350 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d  mutex) || pFile-
1d360 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f  >nRef==0 );..  O
1d370 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1d380 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
1d390 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1d3a0 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ize=%d\n",.     
1d3b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1d3c0 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20  le.h, lockType, 
1d3d0 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a  ofst, nByte));..
1d3e0 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
1d3f0 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
1d400 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
1d410 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 57 49  if( lockType==WI
1d420 4e 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  NSHM_UNLCK ){.  
1d430 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b    rc = winUnlock
1d440 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
1d450 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  le.h, ofst, 0, n
1d460 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Byte, 0);.  }els
1d470 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
1d480 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
1d490 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1d4a0 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73     DWORD dwFlags
1d4b0 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c   = LOCKFILE_FAIL
1d4c0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20  _IMMEDIATELY;.  
1d4d0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d    if( lockType =
1d4e0 3d 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 29  = WINSHM_WRLCK )
1d4f0 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
1d500 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
1d510 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  OCK;.    rc = wi
1d520 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
1d530 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61  ->hFile.h, dwFla
1d540 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  gs, ofst, 0, nBy
1d550 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69  te, 0);.  }..  i
1d560 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
1d570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1d590 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1d5a0 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
1d5b0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
1d5c0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1d5d0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1d5e0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e  OCK file=%p, fun
1d5f0 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c  c=%s, errno=%lu,
1d600 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1d610 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1d620 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20  le.h, (lockType 
1d630 3d 3d 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 29  == WINSHM_UNLCK)
1d640 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c   ? "winUnlockFil
1d650 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e" :.           
1d660 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70  "winLockFile", p
1d670 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
1d680 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1d690 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  rc)));..  return
1d6a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
1d6b0 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
1d6c0 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
1d6d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
1d6e0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
1d6f0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
1d700 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e  te3_file*,int,in
1d710 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
1d720 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65  winDelete(sqlite
1d730 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68  3_vfs *,const ch
1d740 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ar*,int);../*.**
1d750 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68   Purge the winSh
1d760 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
1d770 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
1d780 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  th winShmNode.nR
1d790 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
1d7a0 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
1d7b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
1d7c0 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
1d7d0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
1d7e0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
1d7f0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
1d800 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
1d810 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65  void winShmPurge
1d820 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1d830 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  fs, int deleteFl
1d840 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ag){.  winShmNod
1d850 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d  e **pp;.  winShm
1d860 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  Node *p;.  asser
1d870 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
1d880 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43  ld() );.  OSTRAC
1d890 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69  E(("SHM-PURGE pi
1d8a0 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61  d=%lu, deleteFla
1d8b0 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g=%d\n",.       
1d8c0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1d8d0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c  ProcessId(), del
1d8e0 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20  eteFlag));.  pp 
1d8f0 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  = &winShmNodeLis
1d900 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d  t;.  while( (p =
1d910 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20   *pp)!=0 ){.    
1d920 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
1d930 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1d940 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65       if( p->mute
1d950 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74  x ){ sqlite3_mut
1d960 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
1d970 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69  ); }.      for(i
1d980 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
1d990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1d9a0 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d  BOOL bRc = osUnm
1d9b0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e  apViewOfFile(p->
1d9c0 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29  aRegion[i].pMap)
1d9d0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
1d9e0 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e  E(("SHM-PURGE-UN
1d9f0 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  MAP pid=%lu, reg
1da00 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ion=%d, rc=%s\n"
1da10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1da20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1da30 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62  rocessId(), i, b
1da40 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
1da50 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
1da60 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f  UNUSED_VARIABLE_
1da70 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20  VALUE(bRc);.    
1da80 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73      bRc = osClos
1da90 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69  eHandle(p->aRegi
1daa0 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20  on[i].hMap);.   
1dab0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1dac0 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70  HM-PURGE-CLOSE p
1dad0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1dae0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1db00 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1db10 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
1db20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1db30 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45  );.        UNUSE
1db40 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1db50 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (bRc);.      }. 
1db60 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c       if( p->hFil
1db70 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e  e.h!=NULL && p->
1db80 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44  hFile.h!=INVALID
1db90 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
1dba0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1dbb0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1dbc0 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c  );.        winCl
1dbd0 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
1dbe0 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a  e *)&p->hFile);.
1dbf0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1dc00 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1dc10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dc20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29  if( deleteFlag )
1dc30 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
1dc40 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1dc50 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1dc60 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
1dc70 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
1dc80 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20  winDelete(pVfs, 
1dc90 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  p->zFilename, 0)
1dca0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1dcb0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
1dcc0 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  ();.        Simu
1dcd0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1dce0 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
1dcf0 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65      *pp = p->pNe
1dd00 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
1dd10 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f  3_free(p->aRegio
1dd20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1dd30 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d  3_free(p);.    }
1dd40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d  else{.      pp =
1dd50 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   &p->pNext;.    
1dd60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51  }.  }.}../*.** Q
1dd70 75 65 72 79 20 74 68 65 20 73 74 61 74 75 73 20  uery the status 
1dd80 6f 66 20 74 68 65 20 44 4d 53 20 6c 6f 63 6b 20  of the DMS lock 
1dd90 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
1dda0 64 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 73  d file.  Returns
1ddb0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 75 70  .** SQLITE_OK up
1ddc0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 55 70 6f  on success.  Upo
1ddd0 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 69  n success, the i
1dde0 6e 74 65 67 65 72 20 70 6f 69 6e 74 65 64 20 74  nteger pointed t
1ddf0 6f 20 62 79 0a 2a 2a 20 74 68 65 20 70 4c 6f 63  o by.** the pLoc
1de00 6b 54 79 70 65 20 61 72 67 75 6d 65 6e 74 20 77  kType argument w
1de10 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
1de20 65 20 6c 6f 63 6b 20 74 79 70 65 20 68 65 6c 64  e lock type held
1de30 20 62 79 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72   by the.** other
1de40 20 70 72 6f 63 65 73 73 2c 20 61 73 20 66 6f 6c   process, as fol
1de50 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
1de60 20 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 2d    WINSHM_UNLCK -
1de70 2d 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68  - No locks are h
1de80 65 6c 64 20 6f 6e 20 74 68 65 20 44 4d 53 2e 0a  eld on the DMS..
1de90 2a 2a 20 20 20 20 20 20 20 57 49 4e 53 48 4d 5f  **       WINSHM_
1dea0 52 44 4c 43 4b 20 2d 2d 20 41 20 53 48 41 52 45  RDLCK -- A SHARE
1deb0 44 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  D lock is held o
1dec0 6e 20 74 68 65 20 44 4d 53 2e 0a 2a 2a 20 20 20  n the DMS..**   
1ded0 20 20 20 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b      WINSHM_WRLCK
1dee0 20 2d 2d 20 41 6e 20 45 58 43 4c 55 53 49 56 45   -- An EXCLUSIVE
1def0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1df00 20 74 68 65 20 44 4d 53 2e 0a 2a 2f 0a 73 74 61   the DMS..*/.sta
1df10 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 53 68  tic int winGetSh
1df20 6d 44 6d 73 4c 6f 63 6b 54 79 70 65 28 0a 20 20  mDmsLockType(.  
1df30 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
1df40 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
1df50 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  bject */.  int *
1df60 70 4c 6f 63 6b 54 79 70 65 20 20 2f 2a 20 57 49  pLockType  /* WI
1df70 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 53  NSHM_UNLCK, WINS
1df80 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 57 49 4e  HM_RDLCK, or WIN
1df90 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 29 7b 0a  SHM_WRLCK */.){.
1dfa0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
1dfb0 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
1dfc0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
1dfd0 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 4f  _OVERLAPPED).  O
1dfe0 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
1dff0 70 70 65 64 3b 20 2f 2a 20 54 68 65 20 6f 66 66  pped; /* The off
1e000 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
1e010 2f 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23  /WriteFile. */.#
1e020 65 6e 64 69 66 0a 20 20 4c 50 56 4f 49 44 20 70  endif.  LPVOID p
1e030 4f 76 65 72 6c 61 70 70 65 64 20 3d 20 30 3b 0a  Overlapped = 0;.
1e040 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1e050 6f 66 66 73 65 74 20 3d 20 57 49 4e 5f 53 48 4d  offset = WIN_SHM
1e060 5f 44 4d 53 3b 0a 20 20 42 59 54 45 20 6e 6f 74  _DMS;.  BYTE not
1e070 55 73 65 64 31 20 3d 20 30 3b 0a 20 20 44 57 4f  Used1 = 0;.  DWO
1e080 52 44 20 6e 6f 74 55 73 65 64 32 20 3d 20 30 3b  RD notUsed2 = 0;
1e090 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1e0a0 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64  WINCE || defined
1e0b0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
1e0c0 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 69  _OVERLAPPED).  i
1e0d0 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70  f( winSeekFile(p
1e0e0 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b  File, offset) ){
1e0f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e100 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3b 0a 20  TE_IOERR_SEEK;. 
1e110 20 7d 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65   }.#else.  memse
1e120 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
1e130 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
1e140 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70  PED));.  overlap
1e150 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
1e160 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
1e170 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72  fffffff);.  over
1e180 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
1e190 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
1e1a0 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
1e1b0 66 66 66 66 29 3b 0a 20 20 70 4f 76 65 72 6c 61  ffff);.  pOverla
1e1c0 70 70 65 64 20 3d 20 26 6f 76 65 72 6c 61 70 70  pped = &overlapp
1e1d0 65 64 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ed;.#endif.  if(
1e1e0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
1e1f0 69 6c 65 2d 3e 68 2c 20 26 6e 6f 74 55 73 65 64  ile->h, &notUsed
1e200 31 2c 20 31 2c 20 26 6e 6f 74 55 73 65 64 32 2c  1, 1, &notUsed2,
1e210 20 70 4f 76 65 72 6c 61 70 70 65 64 29 20 29 7b   pOverlapped) ){
1e220 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
1e230 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1e240 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28  Error();.    if(
1e250 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
1e260 6c 65 2d 3e 68 2c 20 26 6e 6f 74 55 73 65 64 31  le->h, &notUsed1
1e270 2c 20 31 2c 20 26 6e 6f 74 55 73 65 64 32 2c 20  , 1, &notUsed2, 
1e280 70 4f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  pOverlapped) ){.
1e290 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
1e2a0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1e2b0 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 77 69  ();.      if( wi
1e2c0 6e 49 73 4c 6f 63 6b 69 6e 67 45 72 72 6f 72 28  nIsLockingError(
1e2d0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
1e2e0 20 20 20 20 20 20 2a 70 4c 6f 63 6b 54 79 70 65        *pLockType
1e2f0 20 3d 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 3b   = WINSHM_WRLCK;
1e300 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e310 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e320 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
1e330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e340 65 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e  e{.      if( win
1e350 49 73 4c 6f 63 6b 69 6e 67 45 72 72 6f 72 28 6c  IsLockingError(l
1e360 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
1e370 20 20 20 20 20 2a 70 4c 6f 63 6b 54 79 70 65 20       *pLockType 
1e380 3d 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 3b 0a  = WINSHM_RDLCK;.
1e390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e3a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e3b0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1e3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4c 6f 63  }else{.    *pLoc
1e3e0 6b 54 79 70 65 20 3d 20 57 49 4e 53 48 4d 5f 55  kType = WINSHM_U
1e3f0 4e 4c 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NLCK;.  }.  retu
1e400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e410 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c  ./*.** The DMS l
1e420 6f 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ock has not yet 
1e430 62 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68  been taken on sh
1e440 6d 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e  m file pShmNode.
1e450 20 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74   Attempt to.** t
1e460 61 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74 75  ake it now. Retu
1e470 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1e480 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1e490 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
1e4a0 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
1e4b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44  ..**.** If the D
1e4c0 4d 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63  MS cannot be loc
1e4d0 6b 65 64 20 62 65 63 61 75 73 65 20 74 68 69 73  ked because this
1e4e0 20 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73   is a readonly_s
1e4f0 68 6d 3d 31 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  hm=1.** connecti
1e500 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  on and no other 
1e510 70 72 6f 63 65 73 73 20 61 6c 72 65 61 64 79 20  process already 
1e520 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65  holds a lock, re
1e530 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52  turn.** SQLITE_R
1e540 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
1e550 20 61 6e 64 20 73 65 74 20 70 53 68 6d 4e 6f 64   and set pShmNod
1e560 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e  e->isUnlocked=1.
1e570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1e580 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f  inLockSharedMemo
1e590 72 79 28 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ry(winShmNode *p
1e5a0 53 68 6d 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ShmNode){.  int 
1e5b0 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 69 6e 74 20  lockType;.  int 
1e5c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e5d0 0a 20 20 2f 2a 20 55 73 65 20 52 65 61 64 46 69  .  /* Use ReadFi
1e5e0 6c 65 2f 57 72 69 74 65 46 69 6c 65 20 74 6f 20  le/WriteFile to 
1e5f0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f  determine the lo
1e600 63 6b 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  cks other proces
1e610 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 68 6f 6c  ses are.  ** hol
1e620 64 69 6e 67 20 6f 6e 20 74 68 65 20 44 4d 53 20  ding on the DMS 
1e630 62 79 74 65 2e 20 49 66 20 69 74 20 69 6e 64 69  byte. If it indi
1e640 63 61 74 65 73 20 74 68 61 74 20 61 6e 6f 74 68  cates that anoth
1e650 65 72 20 70 72 6f 63 65 73 73 20 69 73 0a 20 20  er process is.  
1e660 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41  ** holding a SHA
1e670 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  RED lock, then t
1e680 68 69 73 20 70 72 6f 63 65 73 73 20 6d 61 79 20  his process may 
1e690 61 6c 73 6f 20 74 61 6b 65 20 61 20 53 48 41 52  also take a SHAR
1e6a0 45 44 0a 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64  ED.  ** lock and
1e6b0 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 6f 70   proceed with op
1e6c0 65 6e 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20  ening the *-shm 
1e6d0 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file..  **.  ** 
1e6e0 4f 72 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  Or, if no other 
1e6f0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1e700 6e 67 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ng any lock, the
1e710 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 0a 20  n this process. 
1e720 20 2a 2a 20 69 73 20 74 68 65 20 66 69 72 73 74   ** is the first
1e730 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20   to open it. In 
1e740 74 68 69 73 20 63 61 73 65 20 74 61 6b 65 20 61  this case take a
1e750 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1e760 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53   on the.  ** DMS
1e770 20 62 79 74 65 20 61 6e 64 20 74 72 75 6e 63 61   byte and trunca
1e780 74 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  te the *-shm fil
1e790 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
1e7a0 69 6e 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20  in size. Then.  
1e7b0 2a 2a 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  ** downgrade to 
1e7c0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
1e7d0 20 74 68 65 20 44 4d 53 20 62 79 74 65 2e 0a 20   the DMS byte.. 
1e7e0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74   **.  ** If anot
1e7f0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
1e800 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
1e810 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1e820 44 4d 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72  DMS byte,.  ** r
1e830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1e840 59 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  Y to the caller 
1e850 28 69 74 20 77 69 6c 6c 20 74 72 79 20 61 67 61  (it will try aga
1e860 69 6e 29 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a  in). An earlier.
1e870 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20    ** version of 
1e880 74 68 69 73 20 63 6f 64 65 20 61 74 74 65 6d 70  this code attemp
1e890 74 65 64 20 74 68 65 20 53 48 41 52 45 44 20 6c  ted the SHARED l
1e8a0 6f 63 6b 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ock at this poin
1e8b0 74 2e 20 42 75 74 0a 20 20 2a 2a 20 74 68 69 73  t. But.  ** this
1e8c0 20 69 6e 74 72 6f 64 75 63 65 64 20 61 20 73 75   introduced a su
1e8d0 62 74 6c 65 20 72 61 63 65 20 63 6f 6e 64 69 74  btle race condit
1e8e0 69 6f 6e 3a 20 69 66 20 74 68 65 20 70 72 6f 63  ion: if the proc
1e8f0 65 73 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a  ess holding.  **
1e900 20 45 58 43 4c 55 53 49 56 45 20 66 61 69 6c 65   EXCLUSIVE faile
1e910 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 72  d just before tr
1e920 75 6e 63 61 74 69 6e 67 20 74 68 65 20 2a 2d 73  uncating the *-s
1e930 68 6d 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  hm file, then th
1e940 69 73 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  is.  ** process 
1e950 6d 69 67 68 74 20 6f 70 65 6e 20 61 6e 64 20 75  might open and u
1e960 73 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  se the *-shm fil
1e970 65 20 77 69 74 68 6f 75 74 20 74 72 75 6e 63 61  e without trunca
1e980 74 69 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e  ting it..  ** An
1e990 64 20 69 66 20 74 68 65 20 2a 2d 73 68 6d 20 66  d if the *-shm f
1e9a0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72  ile has been cor
1e9b0 72 75 70 74 65 64 20 62 79 20 61 20 70 6f 77 65  rupted by a powe
1e9c0 72 20 66 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a  r failure or.  *
1e9d0 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 2c 20  * system crash, 
1e9e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 74 73  the database its
1e9f0 65 6c 66 20 6d 61 79 20 61 6c 73 6f 20 62 65 63  elf may also bec
1ea00 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f  ome corrupt.  */
1ea10 0a 20 20 69 66 28 20 77 69 6e 47 65 74 53 68 6d  .  if( winGetShm
1ea20 44 6d 73 4c 6f 63 6b 54 79 70 65 28 26 70 53 68  DmsLockType(&pSh
1ea30 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 6c  mNode->hFile, &l
1ea40 6f 63 6b 54 79 70 65 29 21 3d 53 51 4c 49 54 45  ockType)!=SQLITE
1ea50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1ea60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1ea70 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  K;.  }else if( l
1ea80 6f 63 6b 54 79 70 65 3d 3d 57 49 4e 53 48 4d 5f  ockType==WINSHM_
1ea90 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66 28  UNLCK ){.    if(
1eaa0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
1eab0 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 70  donly ){.      p
1eac0 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63  ShmNode->isUnloc
1ead0 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ked = 1;.      r
1eae0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1eaf0 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20  NLY_CANTINIT;.  
1eb00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
1eb10 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1eb20 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d  pShmNode, WINSHM
1eb30 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1eb40 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  DMS, 1);.      r
1eb50 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1eb60 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1eb70 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e  INSHM_WRLCK, WIN
1eb80 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1eb90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1eba0 54 45 5f 4f 4b 20 26 26 20 77 69 6e 54 72 75 6e  TE_OK && winTrun
1ebb0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
1ebc0 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
1ebd0 46 69 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  File, 0) ){.    
1ebe0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1ebf0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ec00 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
1ec10 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 53 68        "winLockSh
1ec40 61 72 65 64 4d 65 6d 6f 72 79 22 2c 20 70 53 68  aredMemory", pSh
1ec50 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1ec60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ec70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
1ec80 6b 54 79 70 65 3d 3d 57 49 4e 53 48 4d 5f 57 52  kType==WINSHM_WR
1ec90 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
1eca0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1ecb0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1ecc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1ecd0 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 57  ert( lockType==W
1ece0 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 7c 7c 20 6c  INSHM_UNLCK || l
1ecf0 6f 63 6b 54 79 70 65 3d 3d 57 49 4e 53 48 4d 5f  ockType==WINSHM_
1ed00 52 44 4c 43 4b 20 29 3b 0a 20 20 20 20 77 69 6e  RDLCK );.    win
1ed10 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1ed20 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55  hmNode, WINSHM_U
1ed30 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
1ed40 53 2c 20 31 29 3b 0a 20 20 20 20 72 63 20 3d 20  S, 1);.    rc = 
1ed50 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1ed60 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48  (pShmNode, WINSH
1ed70 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
1ed80 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  _DMS, 1);.  }.. 
1ed90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eda0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
1edb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1edc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1edd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1ede0 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
1edf0 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
1ee00 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1ee10 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
1ee20 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
1ee30 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
1ee40 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
1ee50 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
1ee60 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
1ee70 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
1ee80 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
1ee90 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
1eea0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
1eeb0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
1eec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1eed0 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1eee0 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
1eef0 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
1ef00 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1ef10 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1ef20 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1ef30 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1ef40 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 2f  *pShmNode = 0; /
1ef50 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1ef60 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1ef70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ef80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
1ef90 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1efa0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
1efb0 45 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 77 69  E_ERROR;   /* wi
1efc0 6e 4f 70 65 6e 20 72 65 73 75 6c 74 20 63 6f 64  nOpen result cod
1efd0 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  e */.  winShmNod
1efe0 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
1eff0 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
1f000 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ted winShmNode *
1f010 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f030 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69   Size of zName i
1f040 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73  n bytes */..  as
1f050 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
1f060 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f  m==0 );    /* No
1f070 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  t previously ope
1f080 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ned */..  /* All
1f090 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1f0a0 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f  the new sqlite3_
1f0b0 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73  shm object.  Als
1f0c0 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a  o speculatively.
1f0d0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70    ** allocate sp
1f0e0 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69  ace for a new wi
1f0f0 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c  nShmNode and fil
1f100 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20  ename..  */.  p 
1f110 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1f120 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  ero( sizeof(*p) 
1f130 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1f140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f150 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1f160 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1f170 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
1f180 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
1f190 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1f1a0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
1f1b0 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
1f1c0 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
1f1d0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
1f1e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1f1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f200 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
1f210 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  .  }.  pNew->zFi
1f220 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
1f230 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
1f240 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
1f250 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
1f260 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
1f270 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1f280 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
1f290 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
1f2a0 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
1f2b0 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ame);..  /* Look
1f2c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
1f2d0 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
1f2e0 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
1f2f0 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
1f300 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
1f310 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
1f320 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
1f330 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
1f340 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
1f350 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
1f360 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
1f370 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
1f380 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
1f390 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
1f3a0 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
1f3b0 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
1f3c0 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
1f3d0 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
1f3e0 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
1f3f0 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
1f400 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
1f410 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1f420 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
1f430 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
1f440 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
1f450 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1f460 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
1f470 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f480 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
1f490 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
1f4a0 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
1f4b0 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
1f4c0 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
1f4d0 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
1f4e0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
1f4f0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
1f500 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
1f510 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
1f520 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
1f530 4e 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 73  Node;..    if( s
1f540 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f550 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
1f560 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1f570 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
1f580 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1f590 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1f5a0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
1f5b0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1f5c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1f5d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1f5e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1f5f0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1f600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f610 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
1f620 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1f630 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
1f640 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
1f650 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d 20   ){.      rc2 = 
1f660 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
1f670 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
1f680 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1f690 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  e->zFilename,.  
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
1f6c0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1f6d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1f6e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1f6f0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
1f700 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1f710 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1f720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f730 20 20 20 20 20 30 29 3b 0a 20 20 20 20 7d 0a 20       0);.    }. 
1f740 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
1f750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f760 63 32 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  c2 = winOpen(pDb
1f770 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
1f790 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1f7a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1f7b0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1f7c0 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
1f7d0 3e 68 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  >hFile,.        
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1f7f0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
1f800 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1f810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f820 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 20 20        0);.      
1f830 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1f840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f850 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1f860 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1f870 4b 50 54 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  KPT, osGetLastEr
1f880 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 53  "winOpenShm", pS
1f8b0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1f8c0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
1f8d0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1f8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
1f8f0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
1f900 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 1;.    }..  
1f910 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 53 68    rc = winLockSh
1f920 61 72 65 64 4d 65 6d 6f 72 79 28 70 53 68 6d 4e  aredMemory(pShmN
1f930 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
1f940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1f950 63 21 3d 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  c!=SQLITE_READON
1f960 4c 59 5f 43 41 4e 54 49 4e 49 54 20 29 20 67 6f  LY_CANTINIT ) go
1f970 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1f980 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
1f990 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
1f9a0 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
1f9b0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
1f9c0 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
1f9d0 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 20 64 65  pShmNode;.#if de
1f9e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1f9f0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1fa00 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
1fa10 41 43 45 29 0a 20 20 70 2d 3e 69 64 20 3d 20 70  ACE).  p->id = p
1fa20 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
1fa30 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
1fa40 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
1fa50 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1fa60 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76   p;.  winShmLeav
1fa70 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
1fa80 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
1fa90 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
1faa0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1fab0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
1fac0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
1fad0 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45  r of the winShmE
1fae0 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
1faf0 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
1fb00 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
1fb10 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53  new (struct winS
1fb20 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
1fb30 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
1fb40 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
1fb50 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
1fb60 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
1fb70 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1fb80 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
1fb90 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
1fba0 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
1fbb0 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
1fbc0 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
1fbd0 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
1fbe0 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20  ode->mutex.  ** 
1fbf0 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
1fc00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1fc10 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1fc20 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
1fc30 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1fc40 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
1fc50 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
1fc60 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1fc70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1fc80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1fc90 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1fca0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
1fcb0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
1fcc0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1fcd0 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48  (pShmNode, WINSH
1fce0 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
1fcf0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53  _DMS, 1);.  winS
1fd00 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
1fd10 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a  Vfs, 0);      /*
1fd20 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
1fd30 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
1fd40 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
1fd50 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71  e3_free(p);.  sq
1fd60 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1fd70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1fd80 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
1fd90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
1fda0 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
1fdb0 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
1fdc0 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
1fdd0 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f  nderlying.** sto
1fde0 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
1fdf0 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ag is true..*/.s
1fe00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1fe10 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
1fe20 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1fe30 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1fe40 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1fe50 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64  emory */.  int d
1fe60 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
1fe70 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
1fe80 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66  after closing if
1fe90 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69   true */.){.  wi
1fea0 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  nFile *pDbFd;   
1feb0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1fec0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d  holding shared-m
1fed0 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1fee0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1fef0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1ff00 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
1ff10 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1ff20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68  *pShmNode; /* Th
1ff30 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
1ff40 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1ff50 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70  */.  winShm **pp
1ff60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
1ff70 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
1ff80 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1ff90 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  ns */..  pDbFd =
1ffa0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
1ffb0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
1ffc0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1ffd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ffe0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1fff0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a  >pShmNode;..  /*
20000 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
20010 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
20020 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
20030 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
20040 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
20050 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
20060 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
20070 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
20080 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
20090 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
200a0 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
200b0 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
200c0 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
200d0 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
200e0 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
200f0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
20100 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
20110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
20120 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
20130 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
20140 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
20150 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
20160 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
20170 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
20180 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
20190 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  oo */.  winShmEn
201a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
201b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
201c0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
201d0 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
201e0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
201f0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  ef==0 ){.    win
20200 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
20210 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67  pVfs, deleteFlag
20220 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c  );.  }.  winShmL
20230 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
20240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
20260 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
20270 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
20280 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f  mory segment..*/
20290 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
202a0 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
202b0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
202c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
202d0 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
202e0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
202f0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
20320 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
20330 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20360 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
20370 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
20380 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
203a0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
203b0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
203c0 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
203d0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
203e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
203f0 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
20400 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
20410 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
20420 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
20430 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
20440 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
20450 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e   locked */.  win
20460 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
20490 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
204a0 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  ngs */.  winShmN
204b0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
204c0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  p->pShmNode;.  i
204d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
204e0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
204f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
20500 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
20510 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20530 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
20540 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
20550 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
20560 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
20570 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
20580 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20590 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
205a0 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
205b0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
205c0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
205d0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
205e0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
205f0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
20600 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
20610 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
20620 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
20630 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
20640 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
20650 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
20660 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
20670 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
20680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
20690 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
206a0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
206b0 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  VE)!=0 );..  mas
206c0 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28  k = (u16)((1U<<(
206d0 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c  ofst+n)) - (1U<<
206e0 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74  ofst));.  assert
206f0 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
20700 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
20710 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20720 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
20730 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
20740 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
20750 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
20760 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
20770 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
20780 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
20790 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
207a0 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
207b0 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
207c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
207d0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
207e0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
207f0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
20800 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
20810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
20820 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
20830 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
20840 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
20850 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
20860 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
20870 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20880 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
20890 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
208a0 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
208b0 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
208c0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
208d0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
208e0 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c  Node, WINSHM_UNL
208f0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
20900 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
20910 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
20920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20930 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
20940 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
20950 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
20960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20970 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
20980 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
20990 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
209a0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
209b0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
209c0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
209d0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
209e0 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
209f0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
20a00 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
20a10 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
20a20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
20a30 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
20a40 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
20a50 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
20a60 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
20a70 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
20a80 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
20a90 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
20aa0 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
20ab0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
20ac0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
20ad0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
20ae0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
20af0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
20b00 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
20b10 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
20b20 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
20b30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20b40 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
20b50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
20b60 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
20b70 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
20b80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
20b90 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
20ba0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
20bb0 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
20bc0 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
20bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20be0 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
20bf0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
20c00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
20c10 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
20c20 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f  ShmNode, WINSHM_
20c30 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  RDLCK, ofst+WIN_
20c40 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
20c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20c60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20c70 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
20c80 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
20c90 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
20ca0 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
20cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20cc0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
20cd0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
20ce0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
20cf0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
20d00 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
20d10 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
20d20 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
20d30 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
20d40 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
20d50 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
20d60 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
20d70 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
20d80 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
20d90 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
20da0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
20db0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
20dc0 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
20dd0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
20de0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
20df0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
20e00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20e10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20e20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
20e30 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
20e40 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
20e50 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
20e60 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
20e70 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
20e80 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
20e90 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
20ea0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
20eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20ec0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
20ed0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
20ee0 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b  de, WINSHM_WRLCK
20ef0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
20f00 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
20f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20f20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
20f30 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
20f40 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
20f50 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
20f60 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
20f70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20f80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20f90 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
20fa0 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
20fb0 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64  E(("SHM-LOCK pid
20fc0 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61  =%lu, id=%d, sha
20fd0 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78  redMask=%03x, ex
20fe0 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d  clMask=%03x, rc=
20ff0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
21000 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
21010 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64  ocessId(), p->id
21020 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
21030 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
21040 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21050 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
21060 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21070 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
21080 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
21090 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
210a0 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
210b0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64  ..**.** All load
210c0 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
210d0 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
210e0 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
210f0 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
21100 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
21110 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
21120 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
21130 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
21140 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
21150 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
21160 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
21170 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
21180 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
21190 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
211a0 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  R(fd);.  sqlite3
211b0 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
211c0 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64     /* compiler-d
211d0 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61  efined memory ba
211e0 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
211f0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20  mEnterMutex();  
21200 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74       /* Also mut
21210 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e  ex, for redundan
21220 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65  cy */.  winShmLe
21230 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
21240 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21250 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
21260 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
21270 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
21280 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61  on of the.** sha
21290 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
212a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
212b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
212c0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
212d0 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75  egions.** are nu
212e0 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
212f0 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
21300 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
21310 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
21320 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
21330 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
21340 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
21350 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
21360 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
21370 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
21380 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
21390 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70  if the isWrite p
213a0 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
213b0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
213c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
213d0 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
213e0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
213f0 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
21400 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
21410 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
21420 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
21430 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
21440 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
21450 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
21460 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  If.** isWrite is
21470 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
21480 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
21490 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
214a0 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20   has not yet.** 
214b0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
214c0 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
214d0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
214e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
214f0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
21500 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
21510 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
21520 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
21530 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
21540 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
21550 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
21560 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
21570 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64 72  rocesses.** addr
21580 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
21590 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
215a0 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
215b0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
215c0 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ped.** memory an
215d0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
215e0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
215f0 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
21600 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
21610 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
21620 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
21630 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
21640 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
21650 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
21660 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
21670 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
21680 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
216b0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
216c0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
216d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
216e0 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
216f0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
21700 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
21710 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
21720 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
21730 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
21740 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
21750 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
21760 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20   winShm *pShm = 
21770 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
21780 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
21790 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 70 72 6f  ode;.  DWORD pro
217a0 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
217b0 57 52 49 54 45 3b 0a 20 20 44 57 4f 52 44 20 66  WRITE;.  DWORD f
217c0 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f  lags = FILE_MAP_
217d0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
217e0 5f 52 45 41 44 3b 0a 20 20 69 6e 74 20 72 63 20  _READ;.  int rc 
217f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
21800 69 66 28 20 21 70 53 68 6d 20 29 7b 0a 20 20 20  if( !pShm ){.   
21810 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61   rc = winOpenSha
21820 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
21830 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21840 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
21850 20 72 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20   rc;.    pShm = 
21860 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
21870 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  .  pShmNode = pS
21880 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  hm->pShmNode;.. 
21890 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
218a0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
218b0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68  utex);.  if( pSh
218c0 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65  mNode->isUnlocke
218d0 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  d ){.    rc = wi
218e0 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72  nLockSharedMemor
218f0 79 28 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20  y(pShmNode);.   
21900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21910 4f 4b 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  OK ) goto shmpag
21920 65 5f 6f 75 74 3b 0a 20 20 20 20 70 53 68 6d 4e  e_out;.    pShmN
21930 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20  ode->isUnlocked 
21940 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
21950 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
21960 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
21970 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
21980 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  gion==0 );..  if
21990 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
219a0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
219b0 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65      struct ShmRe
219c0 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20  gion *apNew;    
219d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52         /* New aR
219e0 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
219f0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
21a00 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52   (iRegion+1)*szR
21a10 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d  egion;  /* Minim
21a20 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
21a30 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
21a40 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20  ite3_int64 sz;  
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
21a70 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  of wal-index fil
21a80 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  e */..    pShmNo
21a90 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
21aa0 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a  zRegion;..    /*
21ab0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
21ac0 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
21ad0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
21ae0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
21af0 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68  space..    ** Ch
21b00 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
21b10 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
21b20 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
21b30 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
21b40 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  is.    ** large 
21b50 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
21b60 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
21b70 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a  region)..    */.
21b80 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
21b90 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
21ba0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
21bb0 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20  hFile, &sz);.   
21bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
21be0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
21bf0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
21c00 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
21c10 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
21c20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
21c30 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d  ShmMap1", pDbFd-
21c40 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 67  >zPath);.      g
21c50 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
21c60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
21c70 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  sz<nByte ){.    
21c80 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
21c90 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
21ca0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
21cb0 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20 73   If isWrite is s
21cc0 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a  et to.      ** z
21cd0 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  ero, exit early.
21ce0 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
21cf0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
21d00 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
21d10 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21d20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  ** Alternatively
21d30 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73 20  , if isWrite is 
21d40 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74  non-zero, use ft
21d50 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c  runcate() to all
21d60 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  ocate.      ** t
21d70 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
21d80 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20  ory region..    
21d90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
21da0 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73  isWrite ) goto s
21db0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
21dc0 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
21dd0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
21de0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
21df0 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ile, nByte);.   
21e00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21e10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21e20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
21e30 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
21e40 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74  MSIZE, osGetLast
21e50 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e70 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20    "winShmMap2", 
21e80 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
21e90 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
21ea0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
21eb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
21ec0 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
21ed0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
21ee0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
21ef0 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
21f00 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
21f10 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69   (struct ShmRegi
21f20 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  on *)sqlite3_rea
21f30 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20  lloc64(.        
21f40 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
21f50 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
21f60 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a  izeof(apNew[0]).
21f70 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
21f80 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
21f90 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
21fa0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
21fb0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
21fc0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
21fd0 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
21fe0 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 69   = apNew;..    i
21ff0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
22000 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadonly ){.     
22010 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
22020 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
22030 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50  flags = FILE_MAP
22040 5f 52 45 41 44 3b 0a 20 20 20 20 7d 0a 0a 20 20  _READ;.    }..  
22050 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
22060 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
22070 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
22080 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
22090 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
220a0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
220b0 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
220c0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
220d0 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
220e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
220f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
22100 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
22110 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
22120 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
22130 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
22140 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
22150 70 72 6f 74 65 63 74 2c 20 6e 42 79 74 65 2c 20  protect, nByte, 
22160 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
22170 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
22180 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
22190 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  E).      hMap = 
221a0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
221b0 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingW(pShmNode->h
221c0 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
221d0 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c    NULL, protect,
221e0 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
221f0 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
22200 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
22210 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
22220 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52   SQLITE_WIN32_CR
22230 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41  EATEFILEMAPPINGA
22240 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
22250 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
22260 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gA(pShmNode->hFi
22270 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
22280 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 30  NULL, protect, 0
22290 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
222a0 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
222b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
222c0 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69 64  M-MAP-CREATE pid
222d0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
222e0 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
222f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22300 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
22310 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
22320 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e  Node->nRegion, n
22330 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Byte,.          
22340 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22       hMap ? "ok"
22350 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
22360 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b       if( hMap ){
22370 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
22380 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  fset = pShmNode-
22390 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  >nRegion*szRegio
223a0 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  n;.        int i
223b0 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
223c0 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
223d0 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
223e0 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20  ranularity;.#if 
223f0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
22400 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
22410 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
22420 6f 6d 41 70 70 28 68 4d 61 70 2c 20 66 6c 61 67  omApp(hMap, flag
22430 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s,.            i
22440 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
22450 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
22460 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
22470 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
22480 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
22490 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68  sMapViewOfFile(h
224a0 4d 61 70 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  Map, flags,.    
224b0 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73          0, iOffs
224c0 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
224d0 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
224e0 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
224f0 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20     );.#endif.   
22500 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
22510 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25  HM-MAP-MAP pid=%
22520 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f  lu, region=%d, o
22530 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
22540 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
22560 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
22570 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
22580 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
22590 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
225a0 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d      szRegion, pM
225b0 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
225c0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
225d0 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
225e0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
225f0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
22600 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
22610 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
22620 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
22630 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
22640 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
22650 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22670 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62  winShmMap3", pDb
22680 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
22690 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f      if( hMap ) o
226a0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61  sCloseHandle(hMa
226b0 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  p);.        goto
226c0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
226d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68      }..      pSh
226e0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
226f0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
22700 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20  ].pMap = pMap;. 
22710 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
22720 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
22730 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d  >nRegion].hMap =
22740 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   hMap;.      pSh
22750 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
22760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
22770 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
22780 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
22790 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
227a0 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69   int iOffset = i
227b0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
227c0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
227d0 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
227e0 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
227f0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
22800 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a  rity;.    char *
22810 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d  p = (char *)pShm
22820 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52  Node->aRegion[iR
22830 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20  egion].pMap;.   
22840 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26   *pp = (void *)&
22850 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b  p[iOffsetShift];
22860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
22870 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
22880 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
22890 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
228a0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
228b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
228c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
228d0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
228e0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
228f0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
22900 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
22910 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
22920 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
22930 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
22940 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
22950 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
22960 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
22970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
22980 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  AL */../*.** Cle
22990 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65  ans up the mappe
229a0 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20  d region of the 
229b0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20  specified file, 
229c0 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53  if any..*/.#if S
229d0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
229e0 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
229f0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69   winUnmapfile(wi
22a00 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
22a10 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
22a20 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
22a30 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
22a40 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68  %lu, pFile=%p, h
22a50 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  Map=%p, pMapRegi
22a60 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
22a70 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c      "mmapSize=%l
22a80 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75  ld, mmapSizeActu
22a90 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a  al=%lld, mmapSiz
22aa0 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  eMax=%lld\n",.  
22ab0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
22ac0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
22ad0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
22ae0 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61  hMap, pFile->pMa
22af0 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  pRegion,.       
22b00 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
22b10 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ize, pFile->mmap
22b20 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c  SizeActual, pFil
22b30 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29  e->mmapSizeMax))
22b40 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ;.  if( pFile->p
22b50 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  MapRegion ){.   
22b60 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65   if( !osUnmapVie
22b70 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70  wOfFile(pFile->p
22b80 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20  MapRegion) ){.  
22b90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
22ba0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
22bb0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
22bc0 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
22bd0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
22be0 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
22bf0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
22c00 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
22c10 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
22c20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22c30 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
22c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c50 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
22c60 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n));.      retur
22c70 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
22c80 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
22c90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
22ca0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
22cc0 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69  Unmapfile1", pFi
22cd0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
22ce0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61  }.    pFile->pMa
22cf0 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
22d00 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
22d10 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
22d20 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
22d30 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
22d40 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c  File->hMap!=NULL
22d50 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43   ){.    if( !osC
22d60 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
22d70 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20  ->hMap) ){.     
22d80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
22d90 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
22da0 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
22db0 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45  ACE(("UNMAP-FILE
22dc0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
22dd0 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d  %p, hMap=%p, rc=
22de0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
22df0 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  P\n",.          
22e00 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
22e10 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
22e20 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70  ile, pFile->hMap
22e30 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
22e40 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
22e50 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
22e60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
22e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22e80 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
22e90 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c  nmapfile2", pFil
22ea0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
22eb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  .    pFile->hMap
22ec0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f   = NULL;.  }.  O
22ed0 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
22ee0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
22ef0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
22f00 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
22f10 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
22f20 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
22f30 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
22f40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22f50 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
22f60 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
22f70 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
22f80 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
22f90 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
22fa0 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
22fb0 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
22fc0 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
22fd0 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
22fe0 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c  , if.** there al
22ff0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
23000 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
23010 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
23020 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74  are still.** out
23030 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28  standing xFetch(
23040 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  ) references to 
23050 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  it, this functio
23060 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
23070 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
23080 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65   nByte is non-ne
23090 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
230a0 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  is the requested
230b0 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
230c0 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
230d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
230e0 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
230f0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
23100 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  he.** requested 
23110 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65  size is the size
23120 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
23130 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c  disk. The actual
23140 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
23150 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20  created mapping 
23160 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65  is either the re
23170 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20  quested size or 
23180 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
23190 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51  ured.** using SQ
231a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
231b0 53 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20  SIZE, whichever 
231c0 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  is smaller..**.*
231d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
231e0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
231f0 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e  ror occurs (even
23200 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20   if the mapping 
23210 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61  is not.** recrea
23220 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  ted as a result 
23230 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  of outstanding r
23240 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e  eferences) or an
23250 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
23260 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
23270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
23280 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  inMapfile(winFil
23290 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f  e *pFd, sqlite3_
232a0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
232b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d  sqlite3_int64 nM
232c0 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e  ap = nByte;.  in
232d0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
232e0 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
232f0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
23300 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50  .  OSTRACE(("MAP
23310 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
23320 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  File=%p, size=%l
23330 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
23340 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
23350 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
23360 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20  nByte));..  if( 
23370 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30  pFd->nFetchOut>0
23380 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
23390 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70  _OK;..  if( nMap
233a0 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  <0 ){.    rc = w
233b0 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
233c0 74 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26  te3_file*)pFd, &
233d0 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72  nMap);.    if( r
233e0 63 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  c ){.      OSTRA
233f0 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
23400 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
23410 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
23420 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20  _FSTAT\n",.     
23430 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
23440 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
23450 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20  ), pFd));.      
23460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23470 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
23480 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
23490 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
234a0 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
234b0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
234c0 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e  .  }.  nMap &= ~
234d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
234e0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
234f0 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69  eSize - 1);..  i
23500 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46  f( nMap==0 && pF
23510 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  d->mmapSize>0 ){
23520 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
23530 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66  e(pFd);.  }.  if
23540 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
23550 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69  pSize ){.    voi
23560 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  d *pNew = 0;.   
23570 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d   DWORD protect =
23580 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a   PAGE_READONLY;.
23590 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20      DWORD flags 
235a0 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b  = FILE_MAP_READ;
235b0 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  ..    winUnmapfi
235c0 6c 65 28 70 46 64 29 3b 0a 23 69 66 64 65 66 20  le(pFd);.#ifdef 
235d0 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
235e0 57 52 49 54 45 0a 20 20 20 20 69 66 28 20 28 70  WRITE.    if( (p
235f0 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
23600 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  WINFILE_RDONLY)=
23610 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74  =0 ){.      prot
23620 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57  ect = PAGE_READW
23630 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67  RITE;.      flag
23640 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52  s |= FILE_MAP_WR
23650 49 54 45 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ITE;.    }.#endi
23660 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  f.#if SQLITE_OS_
23670 57 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68  WINRT.    pFd->h
23680 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
23690 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
236a0 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
236b0 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55  rotect, nMap, NU
236c0 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
236d0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
236e0 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46  HAS_WIDE).    pF
236f0 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
23700 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
23710 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
23720 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
23750 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
23760 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
23790 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
237a0 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66  f), NULL);.#elif
237b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
237c0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
237d0 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
237e0 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
237f0 47 41 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  GA.    pFd->hMap
23800 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
23810 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20  appingA(pFd->h, 
23820 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23850 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
23860 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
23870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
238a0 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
238b0 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  L);.#endif.    i
238c0 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55  f( pFd->hMap==NU
238d0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d  LL ){.      pFd-
238e0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
238f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
23900 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
23910 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23920 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
23930 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70  "winMapfile1", p
23960 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
23970 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
23980 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
23990 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
239a0 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
239b0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
239c0 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
239d0 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
239e0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
239f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23a00 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
23a10 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
23a20 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
23a30 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
23a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23a50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23a60 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73  ( (nMap % winSys
23a70 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29  Info.dwPageSize)
23a80 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
23a90 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54  t( sizeof(SIZE_T
23aa0 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  )==sizeof(sqlite
23ab0 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70  3_int64) || nMap
23ac0 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a  <=0xffffffff );.
23ad0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
23ae0 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  NRT.    pNew = o
23af0 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
23b00 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c  omApp(pFd->hMap,
23b10 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45   flags, 0, (SIZE
23b20 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a  _T)nMap);.#else.
23b30 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
23b40 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e  ViewOfFile(pFd->
23b50 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
23b60 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29  0, (SIZE_T)nMap)
23b70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
23b80 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
23b90 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
23ba0 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20  le(pFd->hMap);. 
23bb0 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d       pFd->hMap =
23bc0 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64   NULL;.      pFd
23bd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
23be0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
23bf0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
23c00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
23c10 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c  ERR_MMAP, pFd->l
23c20 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20   "winMapfile2", 
23c50 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
23c60 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72     /* Log the er
23c70 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75  ror, but continu
23c80 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  e normal operati
23c90 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  on using xRead/x
23ca0 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f  Write */.      O
23cb0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
23cc0 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  E-MAP pid=%lu, p
23cd0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
23ce0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23cf0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
23d00 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
23d10 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
23d20 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
23d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23d40 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61    }.    pFd->pMa
23d50 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a  pRegion = pNew;.
23d60 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
23d70 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46  e = nMap;.    pF
23d80 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
23d90 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20  l = nMap;.  }.. 
23da0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
23db0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
23dc0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
23dd0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
23de0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
23df0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
23e00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23e10 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
23e20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
23e30 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
23e40 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
23e50 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
23e60 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
23e70 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
23e80 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
23e90 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
23ea0 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
23eb0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
23ec0 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
23ed0 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
23ee0 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
23ef0 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
23f00 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
23f10 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
23f20 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
23f30 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
23f40 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
23f50 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
23f60 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
23f70 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
23f80 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
23f90 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
23fa0 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
23fb0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
23fc0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
23fd0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
23fe0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
23ff0 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
24000 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
24010 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
24020 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74  lly.** release t
24030 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20  he reference by 
24040 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74  calling winUnfet
24050 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ch()..*/.static 
24060 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c  int winFetch(sql
24070 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
24080 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
24090 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23  t, void **pp){.#
240a0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
240b0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46  AP_SIZE>0.  winF
240c0 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
240d0 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
240e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
240f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65  abase file */.#e
24100 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  ndif.  *pp = 0;.
24110 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
24120 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
24130 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
24140 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70  d, amount=%d, pp
24150 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
24160 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
24170 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
24180 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29  iOff, nAmt, pp))
24190 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
241a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
241b0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
241c0 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
241d0 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
241e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
241f0 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c  t rc = winMapfil
24200 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
24210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f  _OK ){.        O
24230 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
24240 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
24250 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
24270 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
24280 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
24290 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
242a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
242b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
242c0 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
242d0 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
242e0 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
242f0 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
24300 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
24310 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
24320 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
24330 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
24340 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20  OSTRACE(("FETCH 
24350 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
24360 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70  p, pp=%p, *pp=%p
24370 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
24380 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
24390 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
243a0 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a  sId(), fd, pp, *
243b0 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pp));.  return S
243c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
243d0 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
243e0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
243f0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
24400 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65  function release
24410 73 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  s a.** reference
24420 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
24430 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
24440 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20  winFetch(). The 
24450 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
24460 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
24470 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
24480 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
24490 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
244a0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
244b0 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
244c0 74 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69  the winFetch() i
244d0 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  nvocation..**.**
244e0 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
244f0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
24500 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
24510 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
24520 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e 66  called.** to inf
24530 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65  orm the VFS laye
24540 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e  r that, accordin
24550 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20  g to POSIX, any 
24560 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
24570 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
24580 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
24590 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
245a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
245b0 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
245c0 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
245d0 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69  ff, void *p){.#i
245e0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
245f0 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
24600 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
24610 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
24620 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
24630 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
24640 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
24650 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
24660 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
24670 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
24680 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63 68  ding.  ** xFetch
24690 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c   references. Or,
246a0 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e   if p!=0 (meanin
246b0 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63  g it is an xFetc
246c0 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20  h reference),.  
246d0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  ** then there mu
246e0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
246f0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20  ne outstanding. 
24700 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
24710 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74  ==0)==(pFd->nFet
24720 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  chOut==0) );..  
24730 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d  /* If p!=0, it m
24740 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f  ust match the iO
24750 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61  ff value. */.  a
24760 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
24770 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  ==&((u8 *)pFd->p
24780 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
24790 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
247a0 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
247b0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
247c0 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22  et=%lld, p=%p\n"
247d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
247e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
247f0 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c  Id(), pFd, iOff,
24800 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29   p));..  if( p )
24810 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
24820 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
24830 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20  .    /* FIXME:  
24840 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79  If Windows truly
24850 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73   always prevents
24860 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64   truncating or d
24870 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a  eleting a.    **
24880 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61   file while a ma
24890 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74  pping is held, t
248a0 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
248b0 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29  g winUnmapfile()
248c0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20   call.    ** is 
248d0 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20  unnecessary can 
248e0 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74  be omitted - pot
248f0 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69  entially improvi
24900 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72  ng.    ** perfor
24910 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77  mance.  */.    w
24920 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
24930 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
24940 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
24950 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
24960 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
24970 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
24980 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
24990 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
249a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
249b0 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a  cessId(), fd));.
249c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
249d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
249e0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
249f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
24a00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
24a10 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
24a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a30 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
24a40 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
24a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
24a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ab0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
24ac0 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
24ad0 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
24ae0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
24af0 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
24b00 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
24b10 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
24b20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
24b30 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
24b40 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20  ethod = {.  3,  
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
24b70 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
24b80 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ba0 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
24bb0 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24bd0 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
24be0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
24bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
24c00 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
24c10 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
24c20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
24c30 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
24c40 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
24c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24c60 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
24c70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
24c80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
24c90 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
24ca0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
24cc0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
24cd0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
24cf0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
24d00 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
24d10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
24d20 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
24d30 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
24d40 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
24d50 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
24d60 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
24d70 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
24d80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
24d90 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
24da0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
24db0 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
24dc0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
24dd0 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
24de0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
24df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24e00 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
24e10 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
24e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24e30 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
24e40 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24e60 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
24e70 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20   winShmUnmap,   
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
24ea0 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20  .  winFetch,    
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ec0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a     /* xFetch */.
24ed0 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20    winUnfetch    
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
24f00 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
24f10 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
24f20 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
24f30 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
24f40 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  on an.** sqlite3
24f50 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 20  _file for win32 
24f60 77 69 74 68 6f 75 74 20 70 65 72 66 6f 72 6d 69  without performi
24f70 6e 67 20 61 6e 79 20 6c 6f 63 6b 69 6e 67 2e 0a  ng any locking..
24f80 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
24f90 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24fa0 64 73 20 77 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65  ds winIoNolockMe
24fb0 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
24fe0 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
24ff0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
25000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
25010 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
25020 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
25030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
25040 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
25050 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
25060 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
25070 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
25080 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
25090 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
250a0 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
250b0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
250c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
250d0 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
250e0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
250f0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
25100 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c  Size */.  winNol
25110 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
25120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
25130 63 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63  ck */.  winNoloc
25140 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
25150 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
25160 63 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63  ck */.  winNoloc
25170 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
25180 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
25190 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
251a0 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
251b0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
251c0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
251d0 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
251e0 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
251f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
25200 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
25210 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25220 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
25230 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
25240 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
25250 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
25260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
25270 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
25280 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
25290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
252a0 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
252b0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
252c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
252d0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
252e0 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
25310 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
25340 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
25370 7d 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e 56 66  };..static winVf
25380 73 41 70 70 44 61 74 61 20 77 69 6e 41 70 70 44  sAppData winAppD
25390 61 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e 49 6f  ata = {.  &winIo
253a0 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20 2f 2a  Method,       /*
253b0 20 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c   pMethod */.  0,
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
253e0 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
253f0 20 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63         /* bNoLoc
25400 6b 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  k */.};..static 
25410 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 77 69  winVfsAppData wi
25420 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61 20 3d  nNolockAppData =
25430 20 7b 0a 20 20 26 77 69 6e 49 6f 4e 6f 6c 6f 63   {.  &winIoNoloc
25440 6b 4d 65 74 68 6f 64 2c 20 2f 2a 20 70 4d 65 74  kMethod, /* pMet
25450 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  hod */.  0,     
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25470 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 31 20  pAppData */.  1 
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a    /* bNoLock */.
254a0 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
254b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
25500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
25510 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
25520 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
25530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
25540 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
25550 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
25560 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
25570 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
25580 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
25590 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66   object..*/..#if
255a0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
255b0 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  N__)./*.** Conve
255c0 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72  rt a filename fr
255d0 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20  om whatever the 
255e0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
255f0 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73  ting system.** s
25600 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65  upports for file
25610 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38  names into UTF-8
25620 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
25630 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a   the result is.*
25640 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
25650 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
25660 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
25670 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
25680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
25690 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74   *winConvertToUt
256a0 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
256b0 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
256c0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76  ){.  char *zConv
256d0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
256e0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
256f0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
25700 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
25710 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
25720 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
25730 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
25740 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
25750 65 64 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74  ed = winMbcsToUt
25760 66 38 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73  f8(zFilename, os
25770 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
25780 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
25790 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
257a0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
257b0 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
257c0 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23   zConverted;.}.#
257d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
257e0 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
257f0 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
25800 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
25810 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
25820 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
25830 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
25840 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
25850 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
25860 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
25870 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
25880 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
25890 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
258a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
258b0 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f  d *winConvertFro
258c0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  mUtf8Filename(co
258d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
258e0 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
258f0 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
25900 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
25910 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
25920 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
25930 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
25940 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
25950 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
25960 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
25970 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
25980 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  oMbcs(zFilename,
25990 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
259a0 53 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  SI());.  }.#endi
259b0 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
259c0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
259d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
259e0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
259f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25a00 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
25a10 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
25a20 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73  pecified UTF-8 s
25a30 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20  tring buffer.** 
25a40 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65  ends with a dire
25a50 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
25a60 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65  character or one
25a70 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
25a80 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74  y.** added to it
25a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25aa0 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
25ab0 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  ep(int nBuf, cha
25ac0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20  r *zBuf){.  if( 
25ad0 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  zBuf ){.    int 
25ae0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
25af0 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
25b00 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a    if( nLen>0 ){.
25b10 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
25b20 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d  irSep(zBuf[nLen-
25b30 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  1]) ){.        r
25b40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
25b50 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c  else if( nLen+1<
25b60 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
25b70 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e  zBuf[nLen] = win
25b80 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20  GetDirSep();.   
25b90 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31       zBuf[nLen+1
25ba0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
25bb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
25bc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
25bd0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
25be0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
25bf0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
25c00 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
25c10 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20  sulting pointer 
25c20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54  into pzBuf..** T
25c30 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
25c40 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73  ned in pzBuf mus
25c50 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73  t be freed via s
25c60 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
25c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
25c80 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
25c90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
25ca0 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20  har **pzBuf){.  
25cb0 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
25cc0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
25cd0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
25ce0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
25cf0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
25d00 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
25d10 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
25d20 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
25d30 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74  nPre = sqlite3St
25d40 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
25d50 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
25d60 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75  .  int nMax, nBu
25d70 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20  f, nDir, nLen;. 
25d80 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
25d90 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
25da0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
25db0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
25dc0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
25dd0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
25de0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
25df0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
25e00 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
25e10 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
25e20 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
25e30 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
25e40 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
25e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
25e60 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
25e70 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
25e80 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
25e90 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66  ully qualified f
25ea0 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f  ile.  ** name fo
25eb0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
25ec0 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66  file.  If this f
25ed0 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20  ails, we cannot 
25ee0 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20  continue..  */. 
25ef0 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78   nMax = pVfs->mx
25f00 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d  Pathname; nBuf =
25f10 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75   nMax + 2;.  zBu
25f20 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f = sqlite3Mallo
25f30 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20  cZero( nBuf );. 
25f40 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20   if( !zBuf ){.  
25f50 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
25f60 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
25f70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
25f80 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
25f90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
25fa0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
25fb0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
25fc0 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d  he effective tem
25fd0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
25fe0 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
25ff0 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20  if one.  ** has 
26000 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20  been explicitly 
26010 73 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69  set by the appli
26020 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73  cation; otherwis
26030 65 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20  e, use the one. 
26040 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62   ** configured b
26050 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  y the operating 
26060 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  system..  */.  n
26070 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50  Dir = nMax - (nP
26080 72 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65  re + 15);.  asse
26090 72 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20  rt( nDir>0 );.  
260a0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
260b0 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
260c0 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20    int nDirLen = 
260d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
260e0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
260f0 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28  ectory);.    if(
26100 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20   nDirLen>0 ){.  
26110 20 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69      if( !winIsDi
26120 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d  rSep(sqlite3_tem
26130 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72  p_directory[nDir
26140 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
26150 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20     nDirLen++;.  
26160 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26170 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a  nDirLen>nDir ){.
26180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26190 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
261a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
261b0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
261c0 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
261d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
261e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
261f0 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
26200 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c  inGetTempname1",
26210 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
26220 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
26230 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
26240 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65  "%s", sqlite3_te
26250 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
26260 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66     }.  }.#if def
26270 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
26280 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61  .  else{.    sta
26290 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
262a0 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
262b0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
262c0 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
262d0 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
262e0 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  * getenv("TMPDIR
262f0 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
26300 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29  /* getenv("TMP")
26310 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
26320 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20   getenv("TEMP") 
26330 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
26340 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46  getenv("USERPROF
26350 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  ILE") */.       
26360 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
26370 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
26380 20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20        "/tmp",.  
26390 20 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20       ".",.      
263a0 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73   0        /* Lis
263b0 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
263c0 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67      };.    unsig
263d0 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63  ned int i;.    c
263e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
263f0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61  = 0;..    if( !a
26400 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72  zDirs[0] ) azDir
26410 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[0] = getenv("S
26420 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
26430 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
26440 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d  1] ) azDirs[1] =
26450 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
26460 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
26470 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32  rs[2] ) azDirs[2
26480 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22  ] = getenv("TMP"
26490 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
264a0 72 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33  rs[3] ) azDirs[3
264b0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50  ] = getenv("TEMP
264c0 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
264d0 69 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b  irs[4] ) azDirs[
264e0 34 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45  4] = getenv("USE
264f0 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20  RPROFILE");.    
26500 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
26510 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
26520 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69  (azDirs[0]); zDi
26530 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a  r=azDirs[i++]){.
26540 20 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e        void *zCon
26550 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66  verted;.      if
26560 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
26570 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49  inue;.      /* I
26580 66 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74  f the path start
26590 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c  s with a drive l
265a0 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  etter followed b
265b0 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20  y the colon.    
265c0 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
265d0 61 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72  assume it is alr
265e0 65 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69  eady a native Wi
265f0 6e 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77  n32 path; otherw
26600 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ise,.      ** it
26610 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74   must be convert
26620 65 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57  ed to a native W
26630 69 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68  in32 path via th
26640 65 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20  e Cygwin API.   
26650 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75     ** prior to u
26660 73 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a  sing it..      *
26670 2f 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49  /.      if( winI
26680 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
26690 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20  olon(zDir) ){.  
266a0 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
266b0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
266c0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44  mUtf8Filename(zD
266d0 69 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ir);.        if(
266e0 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a   !zConverted ){.
266f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26700 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
26710 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
26720 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
26730 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
26740 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
26750 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26760 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
26770 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
26780 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49          if( winI
26790 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
267a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
267b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
267c0 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
267d0 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20   zDir);.        
267e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
267f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
26800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
26820 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
26830 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  verted);.      }
26840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
26850 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74  onverted = sqlit
26860 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
26870 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ax+1 );.        
26880 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20  if( !zConverted 
26890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
268a0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
268b0 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41  .          OSTRA
268c0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
268d0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
268e0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
268f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
26900 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
26910 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
26920 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
26930 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
26940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26950 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f   osIsNT() ? CCP_
26960 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
26970 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
26980 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20  N_A, zDir,.     
26990 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76             zConv
269a0 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30  erted, nMax+1)<0
269b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
269c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
269d0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
269e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
269f0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
26a00 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
26a10 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
26a20 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
26a30 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
26a40 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
26a50 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
26a60 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
26a70 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
26aa0 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a  pname2", zDir);.
26ab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26ac0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
26ad0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
26ae0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
26af0 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
26b00 77 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  w the candidate 
26b10 64 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73  directory exists
26b20 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20   and should.    
26b30 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
26b40 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d  .  However, we m
26b50 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65  ay need to conve
26b60 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f  rt the string co
26b70 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20  ntaining.       
26b80 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69     ** its name i
26b90 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20  nto UTF-8 (i.e. 
26ba0 69 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20  if it is UTF-16 
26bb0 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20  right now)..    
26bc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26bd0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
26be0 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
26bf0 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65  8Filename(zConve
26c00 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
26c10 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
26c20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26c30 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
26c40 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
26c50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
26c60 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  uf);.           
26c70 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26c80 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26c90 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
26ca0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "));.           
26cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26cc0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
26cd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
26cf0 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
26d00 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
26d10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
26d20 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
26d30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26d40 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
26d50 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
26d60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
26d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26d80 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
26d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26da0 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54    }.#elif !SQLIT
26db0 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
26dc0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
26dd0 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73  _).  else if( os
26de0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  IsNT() ){.    ch
26df0 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
26e00 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68  LPWSTR zWidePath
26e10 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
26e20 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f  Zero( nMax*sizeo
26e30 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20  f(WCHAR) );.    
26e40 69 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29  if( !zWidePath )
26e50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26e60 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
26e70 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
26e80 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
26e90 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
26ea0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
26eb0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
26ec0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
26ed0 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
26ee0 65 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a  empPathW(nMax, z
26ef0 57 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a  WidePath)==0 ){.
26f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26f10 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
26f20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26f30 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
26f40 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26f50 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26f60 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
26f70 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
26f80 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
26f90 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
26fa0 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
26fb0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fd0 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
26fe0 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20  mpname2", 0);.  
26ff0 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d    }.    zMulti =
27000 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
27010 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  8(zWidePath);.  
27020 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a    if( zMulti ){.
27030 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
27040 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
27050 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29  f, "%s", zMulti)
27060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27070 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
27080 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27090 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
270a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
270b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
270c0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Path);.      sql
270d0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
270e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
270f0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
27100 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
27110 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
27120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
27130 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
27140 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
27150 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
27160 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
27170 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b      char *zUtf8;
27180 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73  .    char *zMbcs
27190 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
271a0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29  llocZero( nMax )
271b0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73  ;.    if( !zMbcs
271c0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71  Path ){.      sq
271d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
271e0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
271f0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
27200 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
27210 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
27220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27230 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
27240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27250 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e  osGetTempPathA(n
27260 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d  Max, zMbcsPath)=
27270 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27280 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
27290 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
272a0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
272b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
272c0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
272d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
272e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
272f0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
27300 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
27310 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
27330 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c  inGetTempname3",
27340 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
27350 55 74 66 38 20 3d 20 77 69 6e 4d 62 63 73 54 6f  Utf8 = winMbcsTo
27360 55 74 66 38 28 7a 4d 62 63 73 50 61 74 68 2c 20  Utf8(zMbcsPath, 
27370 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
27380 49 28 29 29 3b 0a 20 20 20 20 69 66 28 20 7a 55  I());.    if( zU
27390 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tf8 ){.      sql
273a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
273b0 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
273c0 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
273d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
273e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
273f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27400 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
27410 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
27420 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
27430 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
27440 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27450 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27460 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
27470 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
27480 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
27490 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21  I */.#endif /* !
274a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
274b0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68  */..  /*.  ** Ch
274c0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
274d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
274e0 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69  irectory ends wi
274f0 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  th an appropriat
27500 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72  e.  ** separator
27510 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
27520 74 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  t and there is n
27530 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ot enough space 
27540 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a  left to add.  **
27550 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f   one, fail..  */
27560 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45  .  if( !winMakeE
27570 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b  ndInDirSep(nDir+
27580 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20  1, zBuf) ){.    
27590 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
275a0 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  f);.    OSTRACE(
275b0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
275c0 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
275d0 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
275e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
275f0 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
27600 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c  inGetTempname4",
27610 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   0);.  }..  /*. 
27620 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   ** Check that t
27630 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
27640 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
27650 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
27660 72 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d  ry file.  ** nam
27670 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e in the followi
27680 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a  ng format:.  **.
27690 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61    **   "<tempora
276a0 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74  ry_directory>/et
276b0 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58 58  ilqs_XXXXXXXXXXX
276c0 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20  XXXX\0\0".  **. 
276d0 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75   ** If not, retu
276e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
276f0 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20    The number 17 
27700 69 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 20  is used here in 
27710 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63  order to.  ** ac
27720 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70  count for the sp
27730 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
27740 31 35 20 63 68 61 72 61 63 74 65 72 20 72 61 6e  15 character ran
27750 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74  dom suffix and t
27760 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69  he.  ** two trai
27770 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74  ling NUL charact
27780 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20  ers.  The final 
27790 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
277a0 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20 20  tor character.  
277b0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61  ** has already a
277c0 64 64 65 64 20 69 66 20 69 74 20 77 61 73 20 6e  dded if it was n
277d0 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  ot already prese
277e0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20  nt..  */.  nLen 
277f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
27800 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28  0(zBuf);.  if( (
27810 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37  nLen + nPre + 17
27820 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20  ) > nBuf ){.    
27830 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
27840 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  f);.    OSTRACE(
27850 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
27860 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
27870 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
27880 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
27890 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
278a0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c  inGetTempname5",
278b0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69   0);.  }..  sqli
278c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
278d0 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b  f-16-nLen, zBuf+
278e0 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d  nLen, SQLITE_TEM
278f0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
27900 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74  .  j = sqlite3St
27910 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
27920 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
27930 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
27940 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ;.  for(i=0; i<1
27950 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
27960 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
27970 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
27980 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
27990 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
279a0 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a  s)-1) ];.  }.  z
279b0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42  Buf[j] = 0;.  zB
279c0 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a  uf[j+1] = 0;.  *
279d0 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20  pzBuf = zBuf;.. 
279e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
279f0 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73  FILENAME name=%s
27a00 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
27a10 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74  ", zBuf));.  ret
27a20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27a30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
27a40 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
27a50 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20   file is really 
27a60 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65  a directory.  Re
27a70 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a  turn false if.**
27a80 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67   it is something
27a90 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69   other than a di
27aa0 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74  rectory, or if t
27ab0 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
27ac0 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c   of memory.** al
27ad0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
27ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27af0 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
27b00 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29  oid *zConverted)
27b10 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
27b20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
27b30 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
27b40 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
27b50 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
27b60 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
27b70 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
27b80 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
27b90 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
27ba0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
27bb0 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
27bc0 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
27bd0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
27be0 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
27bf0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
27c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c10 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
27c20 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c40 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
27c50 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65  rData)) && winRe
27c60 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
27c70 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
27c80 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
27c90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
27ca0 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a   Invalid name? *
27cb0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72  /.    }.    attr
27cc0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
27cd0 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23  ileAttributes;.#
27ce0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
27cf0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
27d00 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
27d10 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
27d20 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
27d30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
27d40 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e  return (attr!=IN
27d50 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
27d60 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26  BUTES) && (attr&
27d70 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
27d80 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a  IRECTORY);.}../*
27d90 20 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   forward referen
27da0 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
27db0 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
27dc0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
27de0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
27df0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27e00 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
27e10 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
27e20 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
27e30 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
27e40 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
27e50 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
27e60 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
27e70 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
27e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27e90 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 3b  UT: Result */.);
27ea0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
27eb0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
27ec0 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
27ed0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27ee0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
27ef0 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70  to get maximum p
27f00 61 74 68 20 6c 65 6e 67 74 68 20 61 6e 64 20 41  ath length and A
27f10 70 70 44 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73  ppData */.  cons
27f20 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
27f30 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
27f40 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
27f50 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
27f60 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
27f70 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
27f80 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
27f90 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
27fa0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
27fb0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
27fc0 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
27fd0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
27fe0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
27ff0 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
28000 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
28010 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
28020 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64  o = 0;.  DWORD d
28030 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a  wDesiredAccess;.
28040 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d    DWORD dwShareM
28050 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43  ode;.  DWORD dwC
28060 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
28070 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  on;.  DWORD dwFl
28080 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
28090 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45   = 0;.#if SQLITE
280a0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
280b0 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64  isTemp = 0;.#end
280c0 69 66 0a 20 20 77 69 6e 56 66 73 41 70 70 44 61  if.  winVfsAppDa
280d0 74 61 20 2a 70 41 70 70 44 61 74 61 3b 0a 20 20  ta *pAppData;.  
280e0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
280f0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
28100 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
28110 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
28120 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f  /* Filename in O
28130 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  S encoding */.  
28140 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66  const char *zUtf
28150 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f  8Name = zName; /
28160 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54  * Filename in UT
28170 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  F-8 encoding */.
28180 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a    int cnt = 0;..
28190 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
281a0 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
281b0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
281c0 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
281d0 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
281e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
281f0 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
28200 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
28210 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
28220 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e  */.  char *zTmpn
28230 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20  ame = 0; /* For 
28240 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
28250 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  me, if necessary
28260 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d  . */..  int rc =
28270 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
28280 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
28290 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
282a0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
282b0 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45  DEBUG) || SQLITE
282c0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
282d0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
282e0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
282f0 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
28300 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  en */.#endif..  
28310 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
28320 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
28330 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
28340 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
28350 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
28360 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
28370 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
28380 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
28390 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
283a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
283b0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
283c0 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
283d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
283e0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
283f0 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
28400 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
28410 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66  READWRITE);..#if
28420 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
28430 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20  t isOpenJournal 
28440 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
28450 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
28460 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
28470 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  ER_JOURNAL.     
28480 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
28490 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
284a0 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  AL.     || eType
284b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
284c0 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
284d0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
284e0 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d   name=%s, pFile=
284f0 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f  %p, flags=%x, pO
28500 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20  utFlags=%p\n",. 
28510 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e            zUtf8N
28520 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20  ame, id, flags, 
28530 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20  pOutFlags));..  
28540 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
28550 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
28560 73 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  s are true:.  **
28570 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
28580 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
28590 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
285a0 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
285b0 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
285c0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
285d0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
285e0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
285f0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
28600 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
28610 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
28620 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
28630 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
28640 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
28650 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
28660 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
28670 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
28680 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
28690 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
286a0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
286b0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
286c0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
286d0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
286e0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
286f0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
28700 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
28710 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
28720 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
28730 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
28740 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
28750 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
28760 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
28770 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
28780 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d  never.  ** autom
28790 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
287a0 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
287b0 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
287c0 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
287d0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
287e0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
287f0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
28800 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
28810 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
28820 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
28830 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
28840 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
28850 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
28860 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
28870 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
28880 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
28890 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
288a0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
288b0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
288c0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
288d0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
288e0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
288f0 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
28900 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
28910 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
28920 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
28930 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
28940 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
28950 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
28960 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  _DB.       || eT
28970 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
28980 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
28990 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
289a0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
289b0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
289c0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
289d0 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
289e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
289f0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a  _MASTER_JOURNAL.
28a00 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
28a10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
28a20 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
28a30 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
28a40 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
28a50 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
28a60 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
28a70 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c  0, sizeof(winFil
28a80 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  e));.  pFile->h 
28a90 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
28aa0 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c  _VALUE;..#if SQL
28ab0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
28ac0 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26  f( !zUtf8Name &&
28ad0 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   !sqlite3_temp_d
28ae0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
28af0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
28b00 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20  TE_ERROR,.      
28b10 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f    "sqlite3_temp_
28b20 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62  directory variab
28b30 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  le should be set
28b40 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20   for WinRT");.  
28b50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
28b60 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
28b70 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
28b80 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
28b90 67 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20  generate a.  ** 
28ba0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
28bb0 61 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  ame to use.  */.
28bc0 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
28bd0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28be0 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
28bf0 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  penJournal );.  
28c00 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d    rc = winGetTem
28c10 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d  pname(pVfs, &zTm
28c20 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
28c30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28c40 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
28c50 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
28c60 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65  c=%s", zUtf8Name
28c70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
28c80 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
28c90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28ca0 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a     zUtf8Name = z
28cb0 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
28cc0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
28cd0 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
28ce0 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
28cf0 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
28d00 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20  .  ** URIs with 
28d10 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
28d20 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
28d30 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
28d40 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
28d50 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
28d60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28d70 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f  (eType!=SQLITE_O
28d80 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20  PEN_MAIN_DB) || 
28d90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
28da0 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20  OPEN_URI) ||.   
28db0 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71      zUtf8Name[sq
28dc0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
28dd0 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  tf8Name)+1]==0 )
28de0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
28df0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20  the filename to 
28e00 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64  the system encod
28e10 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65  ing. */.  zConve
28e20 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
28e30 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
28e40 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  e(zUtf8Name);.  
28e50 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
28e60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28e70 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
28e80 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
28e90 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
28ea0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28eb0 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29  EM", zUtf8Name))
28ec0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28ed0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
28ee0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  BKPT;.  }..  if(
28ef0 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
28f00 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  rted) ){.    sql
28f10 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28f20 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
28f30 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
28f40 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
28f50 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
28f60 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
28f70 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e  N_ISDIR", zUtf8N
28f80 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
28f90 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
28fa0 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20  N_ISDIR;.  }..  
28fb0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
28fc0 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  ){.    dwDesired
28fd0 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
28fe0 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f  _READ | GENERIC_
28ff0 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WRITE;.  }else{.
29000 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
29010 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
29020 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51  AD;.  }..  /* SQ
29030 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
29040 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d  IVE is used to m
29050 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20  ake sure that a 
29060 6e 65 77 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a  new file is.  **
29070 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65   created. SQLite
29080 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20   doesn't use it 
29090 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78 63  to indicate "exc
290a0 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 0a 20  lusive access". 
290b0 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75   ** as it is usu
290c0 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e  ally understood.
290d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78  .  */.  if( isEx
290e0 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f  clusive ){.    /
290f0 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20  * Creates a new 
29100 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
29110 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
29120 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20  y exist. */.    
29130 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65  /* If the file e
29140 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e  xists, it fails.
29150 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
29160 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
29170 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65  CREATE_NEW;.  }e
29180 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65  lse if( isCreate
29190 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
291a0 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f  existing file, o
291b0 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64  r create if it d
291c0 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a  oesn't exist */.
291d0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
291e0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
291f0 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65  _ALWAYS;.  }else
29200 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61  {.    /* Opens a
29210 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
29220 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20  t exists. */.   
29230 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
29240 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58  sition = OPEN_EX
29250 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64  ISTING;.  }..  d
29260 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c  wShareMode = FIL
29270 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46  E_SHARE_READ | F
29280 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b  ILE_SHARE_WRITE;
29290 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
292a0 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
292b0 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c  S_WINCE.    dwFl
292c0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
292d0 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
292e0 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73  E_HIDDEN;.    is
292f0 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a  Temp = 1;.#else.
29300 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
29310 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
29320 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52  ATTRIBUTE_TEMPOR
29330 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ARY.            
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29350 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42     | FILE_ATTRIB
29360 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20  UTE_HIDDEN.     
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
29390 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f  _FLAG_DELETE_ON_
293a0 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20  CLOSE;.#endif.  
293b0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61  }else{.    dwFla
293c0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
293d0 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
293e0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
293f0 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74  * Reports from t
29400 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20  he internet are 
29410 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  that performance
29420 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20   is always.  ** 
29430 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46  better if FILE_F
29440 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
29450 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b  S is used.  Tick
29460 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66  et #2699. */.#if
29470 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
29480 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  .  dwFlagsAndAtt
29490 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f  ributes |= FILE_
294a0 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
294b0 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  SS;.#endif..  if
294c0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
294d0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
294e0 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45  T.    CREATEFILE
294f0 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
29500 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61  ETERS extendedPa
29510 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78  rameters;.    ex
29520 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
29530 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  .dwSize = sizeof
29540 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  (CREATEFILE2_EXT
29550 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
29560 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  );.    extendedP
29570 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65  arameters.dwFile
29580 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20  Attributes =.   
29590 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
295a0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
295b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d  FILE_ATTRIBUTE_M
295c0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
295d0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
295e0 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67  leFlags = dwFlag
295f0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
29600 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b   FILE_FLAG_MASK;
29610 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
29620 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69  ameters.dwSecuri
29630 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43  tyQosFlags = SEC
29640 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b  URITY_ANONYMOUS;
29650 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
29660 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69  ameters.lpSecuri
29670 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e  tyAttributes = N
29680 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ULL;.    extende
29690 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d  dParameters.hTem
296a0 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c  plateFile = NULL
296b0 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
296c0 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
296d0 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  2((LPCWSTR)zConv
296e0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
29700 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29720 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
29730 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
29750 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
29760 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
29770 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74              &ext
29780 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29  endedParameters)
29790 3b 0a 20 20 20 20 20 20 69 66 28 20 68 21 3d 49  ;.      if( h!=I
297a0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
297b0 4c 55 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LUE ) break;.   
297c0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
297d0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
297e0 74 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20  t isRO = 0;.    
297f0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 77 69      int rc2 = wi
29800 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e  nAccess(pVfs, zN
29810 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ame, SQLITE_ACCE
29820 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b  SS_READ, &isRO);
29830 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
29840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
29850 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sRO ) break;.   
29860 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
29870 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
29880 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
29890 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 6f   );.#else.    do
298a0 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72  {.      h = osCr
298b0 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
298c0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
298f0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29910 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
29920 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
29930 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
29940 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
29950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29960 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
29970 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20          NULL);. 
299a0 20 20 20 20 20 69 66 28 20 68 21 3d 49 4e 56 41       if( h!=INVA
299b0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
299c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
299d0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
299e0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
299f0 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sRO = 0;.       
29a00 20 69 6e 74 20 72 63 32 20 3d 20 77 69 6e 41 63   int rc2 = winAc
29a10 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61 6d 65  cess(pVfs, zName
29a20 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
29a30 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a 20 20  READ, &isRO);.  
29a40 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
29a50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 52 4f  QLITE_OK && isRO
29a60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29a70 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 77 69  }.    }while( wi
29a80 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
29a90 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 3b  , &lastErrno) );
29aa0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
29ab0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
29ac0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
29ad0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 68  .    do{.      h
29ae0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41   = osCreateFileA
29af0 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72  ((LPCSTR)zConver
29b00 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
29b20 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b40 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
29b50 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b70 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
29b80 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ba0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
29bb0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
29bd0 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  LL);.      if( h
29be0 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
29bf0 5f 56 41 4c 55 45 20 29 20 62 72 65 61 6b 3b 0a  _VALUE ) break;.
29c00 20 20 20 20 20 20 69 66 28 20 69 73 52 65 61 64        if( isRead
29c10 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
29c20 20 69 6e 74 20 69 73 52 4f 20 3d 20 30 3b 0a 20   int isRO = 0;. 
29c30 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d         int rc2 =
29c40 20 77 69 6e 41 63 63 65 73 73 28 70 56 66 73 2c   winAccess(pVfs,
29c50 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41   zName, SQLITE_A
29c60 43 43 45 53 53 5f 52 45 41 44 2c 20 26 69 73 52  CCESS_READ, &isR
29c70 4f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  O);.        if( 
29c80 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  rc2==SQLITE_OK &
29c90 26 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a  & isRO ) break;.
29ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
29cb0 6c 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  le( winRetryIoer
29cc0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
29cd0 6e 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  no) );.  }.#endi
29ce0 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  f.  winLogIoerr(
29cf0 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  cnt, __LINE__);.
29d00 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
29d10 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
29d20 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
29d30 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
29d40 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
29d50 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
29d60 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
29d70 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
29d80 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
29d90 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
29da0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
29db0 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
29dc0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29dd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
29de0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
29df0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
29e00 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
29e10 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
29e20 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
29e30 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20   zName, id,.    
29e40 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
29e50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
29e60 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20  Y) &.           
29e70 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49            ~(SQLI
29e80 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
29e90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
29ea0 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20  RITE)),.        
29eb0 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
29ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
29ed0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
29ee0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
29ef0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
29f00 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70  LITE_CANTOPEN, p
29f10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
29f20 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66   "winOpen", zUtf
29f30 38 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  8Name);.      re
29f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
29f50 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
29f60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74  .  }..  if( pOut
29f70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28  Flags ){.    if(
29f80 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
29f90 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
29fa0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
29fb0 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
29fc0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
29fd0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
29fe0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
29ff0 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41    }.  }..  OSTRA
2a000 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
2a010 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
2a020 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67  ss=%lx, pOutFlag
2a030 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73  s=%p, *pOutFlags
2a040 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
2a050 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20    "rc=%s\n", h, 
2a060 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73  zUtf8Name, dwDes
2a070 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74  iredAccess, pOut
2a080 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  Flags, pOutFlags
2a090 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70   ?.           *p
2a0a0 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68  OutFlags : 0, (h
2a0b0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
2a0c0 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
2a0d0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
2a0e0 70 41 70 70 44 61 74 61 20 3d 20 28 77 69 6e 56  pAppData = (winV
2a0f0 66 73 41 70 70 44 61 74 61 2a 29 70 56 66 73 2d  fsAppData*)pVfs-
2a100 3e 70 41 70 70 44 61 74 61 3b 0a 0a 23 69 66 20  >pAppData;..#if 
2a110 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
2a120 20 20 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65    {.    if( isRe
2a130 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
2a140 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2a150 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 20 20 26  IN_DB.         &
2a160 26 20 28 28 70 41 70 70 44 61 74 61 3d 3d 4e 55  & ((pAppData==NU
2a170 4c 4c 29 20 7c 7c 20 21 70 41 70 70 44 61 74 61  LL) || !pAppData
2a180 2d 3e 62 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20 20  ->bNoLock).     
2a190 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e      && (rc = win
2a1a0 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
2a1b0 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c  me, pFile))!=SQL
2a1c0 49 54 45 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20  ITE_OK.    ){.  
2a1d0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
2a1e0 65 28 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(h);.      sqli
2a1f0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2a200 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
2a210 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
2a220 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
2a230 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b  E(("OPEN-CE-LOCK
2a240 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c   name=%s, rc=%s\
2a250 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  n", zName, sqlit
2a260 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
2a270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2a280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2a290 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
2a2a0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
2a2b0 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
2a2c0 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
2a2d0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
2a2e0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2a2f0 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ed);.  }..  sqli
2a300 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
2a310 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  e);.  pFile->pMe
2a320 74 68 6f 64 20 3d 20 70 41 70 70 44 61 74 61 20  thod = pAppData 
2a330 3f 20 70 41 70 70 44 61 74 61 2d 3e 70 4d 65 74  ? pAppData->pMet
2a340 68 6f 64 20 3a 20 26 77 69 6e 49 6f 4d 65 74 68  hod : &winIoMeth
2a350 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
2a360 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
2a370 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
2a380 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
2a390 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
2a3a0 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
2a3b0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
2a3c0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2a3d0 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
2a3e0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
2a3f0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
2a400 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
2a410 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
2a420 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46  E_PSOW;.  }.  pF
2a430 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
2a440 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
2a450 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
2a460 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  e;.#if SQLITE_MA
2a470 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
2a480 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
2a490 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61  LL;.  pFile->pMa
2a4a0 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70  pRegion = 0;.  p
2a4b0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
2a4c0 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
2a4d0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
2a4e0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
2a4f0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
2a500 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
2a510 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70  ap;.#endif..  Op
2a520 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
2a530 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a540 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2a550 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
2a560 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
2a570 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
2a580 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
2a590 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
2a5a0 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
2a5b0 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
2a5c0 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
2a5d0 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
2a5e0 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
2a5f0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
2a600 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
2a610 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
2a620 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
2a630 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
2a640 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
2a650 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
2a660 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
2a670 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
2a680 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
2a690 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
2a6a0 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
2a6b0 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
2a6c0 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
2a6d0 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
2a6e0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
2a6f0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
2a700 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
2a710 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
2a720 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
2a730 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
2a740 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
2a750 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
2a760 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
2a770 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2a780 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2a790 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
2a7a0 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
2a7b0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2a7c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2a7d0 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
2a7e0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a800 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
2a810 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
2a820 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
2a830 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
2a840 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
2a850 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
2a860 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
2a870 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a880 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
2a890 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
2a8a0 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
2a8b0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
2a8c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2a8d0 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
2a8e0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
2a8f0 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20   syncDir=%d\n", 
2a900 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44  zFilename, syncD
2a910 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ir));..  zConver
2a920 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
2a930 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
2a940 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
2a950 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
2a960 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
2a970 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
2a980 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
2a990 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
2a9a0 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
2a9b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a9c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2a9d0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
2a9e0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20  ){.    do {.#if 
2a9f0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2aa00 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45        WIN32_FILE
2aa10 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
2aa20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20  sAttrData;.     
2aa30 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
2aa40 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
2aa50 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20  ttrData));.     
2aa60 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41   if ( osGetFileA
2aa70 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f  ttributesExW(zCo
2aa80 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65  nverted, GetFile
2aa90 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aac0 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b    &sAttrData) ){
2aad0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
2aae0 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
2aaf0 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20  Attributes;.    
2ab00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ab10 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
2ab20 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
2ab30 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
2ab40 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
2ab50 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
2ab60 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
2ab70 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
2ab80 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
2ab90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2aba0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
2abb0 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
2abc0 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
2abd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2abe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2abf0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
2ac00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ac10 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
2ac20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
2ac30 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f  eAttributesW(zCo
2ac40 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
2ac50 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
2ac60 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  ==INVALID_FILE_A
2ac70 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20  TTRIBUTES ){.   
2ac80 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
2ac90 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2aca0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
2acb0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
2acc0 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
2acd0 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
2ace0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
2acf0 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
2ad00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ad10 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
2ad20 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
2ad30 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
2ad40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ad50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ad60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2ad70 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
2ad80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ad90 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54  f ( attr&FILE_AT
2ada0 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
2adb0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  Y ){.        rc 
2adc0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
2add0 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a  /* Files only. *
2ade0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
2adf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ae00 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  f ( osDeleteFile
2ae10 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  W(zConverted) ){
2ae20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2ae30 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65  LITE_OK; /* Dele
2ae40 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20  ted OK. */.     
2ae50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ae60 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69  }.      if ( !wi
2ae70 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
2ae80 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
2ae90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2aea0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e  LITE_ERROR; /* N
2aeb0 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20  o more retries. 
2aec0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
2aed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
2aee0 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69  while(1);.  }.#i
2aef0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
2af00 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
2af10 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
2af20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
2af30 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43  leAttributesA(zC
2af40 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2af50 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
2af60 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
2af70 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
2af80 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
2af90 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
2afa0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
2afb0 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
2afc0 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
2afd0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
2afe0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
2aff0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
2b000 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2b010 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
2b020 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
2b030 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
2b040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2b050 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2b060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b080 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
2b090 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
2b0a0 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
2b0b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b0c0 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
2b0d0 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
2b0e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b0f0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
2b100 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e  DeleteFileA(zCon
2b110 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
2b120 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b130 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
2b140 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
2b150 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2b160 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
2b170 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
2b180 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
2b190 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2b1a0 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
2b1b0 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
2b1c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b1d0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
2b1e0 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  1);.  }.#endif. 
2b1f0 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53   if( rc && rc!=S
2b200 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
2b210 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  TE_NOENT ){.    
2b220 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
2b230 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
2b240 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  LETE, lastErrno,
2b250 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46   "winDelete", zF
2b260 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
2b270 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  e{.    winLogIoe
2b280 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f  rr(cnt, __LINE__
2b290 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2b2a0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2b2b0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
2b2c0 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
2b2d0 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%s\n", zFilena
2b2e0 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
2b2f0 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
2b300 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b310 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65  Check the existe
2b320 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
2b330 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
2b340 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
2b350 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
2b360 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2b370 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
2b380 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
2b390 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2b3a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2b3b0 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
2b3c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b3e0 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
2b3f0 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
2b400 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
2b410 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
2b420 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
2b430 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
2b440 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
2b450 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
2b460 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
2b470 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
2b480 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b490 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
2b4a0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2b4b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2b4c0 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53  _ACCESS; );.  OS
2b4d0 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
2b4e0 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78  ame=%s, flags=%x
2b4f0 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
2b500 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
2b510 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52  ename, flags, pR
2b520 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e  esOut));..  zCon
2b530 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
2b540 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
2b550 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
2b560 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
2b570 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
2b580 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
2b590 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
2b5a0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
2b5b0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
2b5c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2b5d0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2b5e0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
2b5f0 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
2b600 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
2b610 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
2b620 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
2b630 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
2b640 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
2b650 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
2b660 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
2b670 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
2b680 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
2b690 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
2b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6b0 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
2b6c0 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
2b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
2b6f0 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
2b700 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
2b710 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
2b720 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2b730 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53       /* For an S
2b740 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2b750 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74  STS query, treat
2b760 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66   a zero-length f
2b770 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ile.      ** as 
2b780 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
2b790 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
2b7a0 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67       if(    flag
2b7b0 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
2b7c0 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20  _EXISTS.        
2b7d0 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
2b7e0 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a  FileSizeHigh==0.
2b7f0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
2b800 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
2b810 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Low==0 ){.      
2b820 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
2b830 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
2b840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b850 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
2b860 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
2b870 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
2b880 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2b890 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63     winLogIoerr(c
2b8a0 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  nt, __LINE__);. 
2b8b0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
2b8c0 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no!=ERROR_FILE_N
2b8d0 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74  OT_FOUND && last
2b8e0 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54  Errno!=ERROR_PAT
2b8f0 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
2b900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2b910 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
2b920 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b930 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2b940 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
2b950 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
2b960 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20  Access",.       
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a      zFilename);.
2b990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b9a0 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
2b9b0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
2b9c0 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
2b9d0 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
2b9e0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2b9f0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
2ba00 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
2ba10 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
2ba20 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
2ba30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
2ba40 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2ba50 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28  rted);.  switch(
2ba60 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
2ba70 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
2ba80 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20  _READ:.    case 
2ba90 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2baa0 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d  ISTS:.      rc =
2bab0 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
2bac0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
2bad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bae0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2baf0 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
2bb00 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
2bb10 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
2bb20 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
2bb30 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20          (attr & 
2bb40 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
2bb50 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
2bb60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
2bb70 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
2bb80 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
2bb90 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
2bba0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
2bbb0 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28   rc;.  OSTRACE((
2bbc0 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
2bbd0 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
2bbe0 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
2bbf0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
2bc00 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
2bc10 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f   pResOut, *pResO
2bc20 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ut));.  return S
2bc30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2bc40 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
2bc50 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
2bc60 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73  fied path name s
2bc70 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
2bc80 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c  ve letter.** fol
2bc90 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e  lowed by a colon
2bca0 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
2bcb0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
2bcc0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
2bcd0 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  lon(.  const cha
2bce0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
2bcf0 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74    return ( sqlit
2bd00 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e  e3Isalpha(zPathn
2bd10 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68  ame[0]) && zPath
2bd20 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a  name[1]==':' );.
2bd30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
2bd40 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2bd50 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
2bd60 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75  name should be u
2bd70 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49  sed verbatim.  I
2bd80 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  f.** non-zero is
2bd90 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74   returned from t
2bda0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
2bdb0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2bdc0 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a  on must simply.*
2bdd0 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64  * use the provid
2bde0 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72  ed path name ver
2bdf0 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c  batim -OR- resol
2be00 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c  ve it into a ful
2be10 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75  l path name.** u
2be20 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c  sing the GetFull
2be30 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41  PathName Win32 A
2be40 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20  PI function (if 
2be50 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73  available)..*/.s
2be60 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
2be70 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
2be80 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2be90 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f  zPathname.){.  /
2bea0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
2beb0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
2bec0 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c  ith a forward sl
2bed0 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61  ash or a backsla
2bee0 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72  sh, it is either
2bef0 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e  .  ** a legal UN
2bf00 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65  C name, a volume
2bf10 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
2bf20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
2bf30 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a  ath name in the.
2bf40 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d    ** "Unix" form
2bf50 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20  at on Windows.  
2bf60 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79  There is no easy
2bf70 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e   way to differen
2bf80 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
2bf90 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f  ** the final two
2bfa0 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72   cases; therefor
2bfb0 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65  e, we return the
2bfc0 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61   safer return va
2bfd0 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a  lue of TRUE.  **
2bfe0 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73   so that callers
2bff0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c000 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73  n will simply us
2c010 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20  e it verbatim.. 
2c020 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
2c030 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65  DirSep(zPathname
2c040 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  [0]) ){.    retu
2c050 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
2c060 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
2c070 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
2c080 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e  with a letter an
2c090 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20  d a colon it is 
2c0a0 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a  either a volume.
2c0b0 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61    ** relative pa
2c0c0 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  th or an absolut
2c0d0 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73  e path.  Callers
2c0e0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c0f0 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20  n must not.  ** 
2c100 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74  attempt to treat
2c110 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76   it as a relativ
2c120 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65  e path name (i.e
2c130 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69  . they should si
2c140 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74  mply use.  ** it
2c150 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f   verbatim)..  */
2c160 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69  .  if ( winIsDri
2c170 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
2c180 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20  (zPathname) ){. 
2c190 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
2c1a0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
2c1b0 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73  f we get to this
2c1c0 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68   point, the path
2c1d0 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d   name should alm
2c1e0 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65  ost certainly be
2c1f0 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72   a purely.  ** r
2c200 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65  elative one (i.e
2c210 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65  . not a UNC name
2c220 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20  , not absolute, 
2c230 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72  and not volume r
2c240 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20  elative)..  */. 
2c250 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
2c260 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
2c270 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
2c280 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
2c290 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68  hname.  Write th
2c2a0 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61  e full.** pathna
2c2b0 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20  me into zOut[]. 
2c2c0 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20   zOut[] will be 
2c2d0 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d  at least pVfs->m
2c2e0 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74  xPathname.** byt
2c2f0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
2c300 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c  tatic int winFul
2c310 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
2c320 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2c330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2c340 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
2c350 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
2c360 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20  har *zRelative, 
2c370 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
2c380 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
2c390 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
2c3a0 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nFull,          
2c3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2c3c0 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
2c3d0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
2c3e0 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20   char *zFull    
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c400 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
2c410 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  */.){.#if !SQLIT
2c420 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
2c430 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2c440 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
2c450 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e  WIN__).  DWORD n
2c460 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
2c470 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
2c480 20 2a 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a   *zOut;.#endif..
2c490 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
2c4a0 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
2c4b0 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
2c4c0 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
2c4d0 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
2c4e0 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
2c4f0 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
2c500 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
2c510 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
2c520 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
2c530 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
2c540 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74  rAndColon(zRelat
2c550 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52  ive+1) ){.    zR
2c560 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
2c570 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
2c580 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
2c590 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2c5a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
2c5b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c5c0 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61  ETER(nFull);.  a
2c5d0 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56  ssert( nFull>=pV
2c5e0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2c5f0 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
2c600 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2c610 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
2c620 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
2c630 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
2c640 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
2c650 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2c660 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
2c670 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
2c680 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
2c690 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2c6a0 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
2c6b0 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
2c6c0 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
2c6d0 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
2c6e0 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
2c6f0 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
2c700 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
2c710 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
2c720 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
2c730 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
2c740 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   slash..    */. 
2c750 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
2c760 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2c770 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
2c780 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
2c790 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
2c7a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2c7b0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2c7c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79      }.    if( cy
2c7d0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49              (osI
2c7f0 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49  sNT() ? CCP_POSI
2c800 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50  X_TO_WIN_W : CCP
2c810 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29  _POSIX_TO_WIN_A)
2c820 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43   |.            C
2c830 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65  CP_RELATIVE, zRe
2c840 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56  lative, zOut, pV
2c850 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2c860 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )<0 ){.      sql
2c870 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2c880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
2c890 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
2c8a0 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
2c8b0 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
2c8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c8d0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2c8e0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
2c8f0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2c900 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
2c910 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
2c920 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
2c930 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  me(zOut);.      
2c940 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
2c950 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c960 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
2c970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c980 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2c990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c9a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c9b0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2c9c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2c9d0 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
2ca00 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
2ca10 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a  inGetDirSep(), z
2ca20 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
2ca30 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
2ca40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2ca50 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
2ca60 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
2ca70 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
2ca80 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
2ca90 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2caa0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
2cab0 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
2cac0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2cad0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2cae0 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
2caf0 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
2cb00 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
2cb10 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
2cb20 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
2cb30 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20  IX_TO_WIN_A),.  
2cb40 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
2cb50 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
2cb60 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
2cb70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2cb80 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
2cb90 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2cba0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2cbb0 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
2cbc0 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbe0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2cbf0 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
2cc00 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
2cc10 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
2cc20 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
2cc30 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
2cc40 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
2cc50 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
2cc60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2cc70 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
2cc80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2cc90 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2cca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2ccb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2ccc0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2ccd0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2cce0 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  l, "%s", zUtf8);
2ccf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2cd00 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
2cd10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2cd20 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Out);.    }.  }.
2cd30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cd40 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
2cd50 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  (SQLITE_OS_WINCE
2cd60 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
2cd70 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  NRT) && !defined
2cd80 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
2cd90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2cda0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2cdb0 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43  ROR );.  /* WinC
2cdc0 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74  E has no concept
2cdd0 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70   of a relative p
2cde0 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49  athname, or so I
2cdf0 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f   am told. */.  /
2ce00 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77  * WinRT has no w
2ce10 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20  ay to convert a 
2ce20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f  relative path to
2ce30 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65   an absolute one
2ce40 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69  . */.  if ( sqli
2ce50 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2ce60 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
2ce70 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
2ce80 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
2ce90 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
2cea0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2ceb0 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
2cec0 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
2ced0 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
2cee0 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
2cef0 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
2cf00 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
2cf10 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
2cf20 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
2cf30 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
2cf40 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
2cf50 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
2cf60 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
2cf70 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
2cf80 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
2cf90 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
2cfa0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2cfb0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2cfc0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2cfd0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2cfe0 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2d000 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
2d010 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
2d020 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65  Sep(), zRelative
2d030 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d040 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2d050 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2d060 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2d070 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c  Full, "%s", zRel
2d080 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65  ative);.  }.  re
2d090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d0a0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
2d0b0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2d0c0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
2d0d0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
2d0e0 59 47 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49 74  YGWIN__).  /* It
2d0f0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
2d100 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
2d110 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
2d120 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
2d130 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
2d140 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
2d150 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
2d160 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
2d170 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
2d180 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
2d190 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
2d1a0 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
2d1b0 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
2d1c0 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
2d1d0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2d1e0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
2d1f0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2d200 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2d210 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20  E_ERROR );.  if 
2d220 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
2d230 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
2d240 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
2d250 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
2d260 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
2d270 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
2d280 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
2d290 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
2d2a0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
2d2b0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
2d2c0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
2d2d0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
2d2e0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
2d2f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
2d300 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
2d310 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2d320 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
2d330 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
2d340 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
2d350 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
2d360 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
2d370 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
2d380 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2d390 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2d3a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2d3b0 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
2d3e0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
2d3f0 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65  GetDirSep(), zRe
2d400 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74  lative);.    ret
2d410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d420 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
2d430 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
2d440 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65  Utf8Filename(zRe
2d450 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a  lative);.  if( z
2d460 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
2d470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d480 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2d490 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  PT;.  }.  if( os
2d4a0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50  IsNT() ){.    LP
2d4b0 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20  WSTR zTemp;.    
2d4c0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
2d4d0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
2d4e0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2d4f0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
2d500 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2d510 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2d520 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2d530 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2d540 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2d550 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2d560 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2d570 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2d580 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2d590 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
2d5a0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2d5b0 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
2d5c0 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
2d5d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2d5e0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
2d5f0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
2d600 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
2d610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2d620 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2d630 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d640 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2d650 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2d660 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2d670 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
2d680 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
2d690 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
2d6a0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
2d6b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2d6c0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2d6d0 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
2d6e0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2d6f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2d700 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2d710 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
2d720 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
2d730 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
2d750 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
2d760 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2d770 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2d780 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2d790 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e  ;.    zOut = win
2d7a0 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
2d7b0 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
2d7c0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2d7d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2d7e0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
2d7f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
2d800 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
2d810 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2d820 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
2d830 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
2d840 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
2d850 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
2d860 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2d870 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2d880 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
2d890 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2d8a0 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
2d8b0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8d0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2d8e0 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61  athname3", zRela
2d8f0 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
2d900 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
2d910 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
2d920 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
2d930 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
2d940 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
2d950 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
2d960 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2d970 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2d980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2d990 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2d9a0 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
2d9b0 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2d9c0 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
2d9d0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
2d9e0 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  Temp, 0);.    if
2d9f0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2da00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2da10 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2da20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2da30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72  (zTemp);.      r
2da40 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
2da50 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2da60 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
2da70 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2daa0 61 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61  athname4", zRela
2dab0 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
2dac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2dad0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
2dae0 4f 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  Out = winMbcsToU
2daf0 74 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65  tf8(zTemp, osAre
2db00 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b  FileApisANSI());
2db10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2db20 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
2db30 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
2db40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2db50 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2db60 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2db70 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2db80 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
2db90 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
2dba0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2dbb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2dbc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2dbd0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2dbe0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
2dbf0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2dc00 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2dc10 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
2dc20 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
2dc30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
2dc40 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
2dc50 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
2dc60 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
2dc70 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
2dc80 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
2dc90 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
2dca0 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
2dcb0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
2dcc0 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
2dcd0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
2dce0 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66  ANDLE h;.#if def
2dcf0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
2dd00 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70  .  int nFull = p
2dd10 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2dd20 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  1;.  char *zFull
2dd30 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2dd40 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20  Zero( nFull );. 
2dd50 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
2dd60 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75  d = 0;.  if( zFu
2dd70 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ll==0 ){.    OST
2dd80 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2dd90 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2dda0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2ddb0 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
2ddc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2ddd0 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  if( winFullPathn
2dde0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2ddf0 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c  ame, nFull, zFul
2de00 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  l)!=SQLITE_OK ){
2de10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2de20 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53  e(zFull);.    OS
2de30 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2de40 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2de50 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2de60 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
2de70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2de80 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
2de90 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
2dea0 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b  Filename(zFull);
2deb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2dec0 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  zFull);.#else.  
2ded0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
2dee0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2def0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
2df00 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
2df10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2df20 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  s);.#endif.  if(
2df30 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
2df40 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
2df50 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
2df60 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
2df70 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
2df80 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
2df90 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  0;.  }.  if( osI
2dfa0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
2dfb0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
2dfc0 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
2dfd0 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
2dfe0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2dff0 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
2e000 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
2e010 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
2e020 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
2e030 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2e040 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
2e050 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
2e060 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
2e070 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
2e080 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
2e090 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2e0a0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2e0b0 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2e0c0 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20  , (void*)h));.  
2e0d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2e0e0 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
2e0f0 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
2e100 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
2e110 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2e120 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2e130 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
2e140 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2e150 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77  METER(pVfs);.  w
2e160 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
2e170 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
2e180 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
2e190 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
2e1a0 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
2e1b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76  ite3_vfs *pVfs,v
2e1c0 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68  oid *pH,const ch
2e1d0 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
2e1e0 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63  {.  FARPROC proc
2e1f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2e200 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72  ETER(pVfs);.  pr
2e210 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64  oc = osGetProcAd
2e220 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
2e230 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52  H, zSym);.  OSTR
2e240 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64  ACE(("DLSYM hand
2e250 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73  le=%p, symbol=%s
2e260 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c  , address=%p\n",
2e270 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  .           (voi
2e280 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f  d*)pH, zSym, (vo
2e290 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65  id*)proc));.  re
2e2a0 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
2e2b0 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74  id))proc;.}.stat
2e2c0 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  ic void winDlClo
2e2d0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
2e2e0 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
2e2f0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
2e300 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2e310 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28    osFreeLibrary(
2e320 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
2e330 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
2e340 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c  CLOSE handle=%p\
2e350 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64  n", (void*)pHand
2e360 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  le));.}.#else /*
2e370 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
2e380 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
2e390 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
2e3a0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
2e3b0 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
2e3c0 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
2e3d0 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
2e3e0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
2e3f0 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2e400 0a 0a 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f 72  ../* State infor
2e410 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  mation for the r
2e420 61 6e 64 6f 6d 6e 65 73 73 20 67 61 74 68 65 72  andomness gather
2e430 65 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  er. */.typedef s
2e440 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74  truct EntropyGat
2e450 68 65 72 65 72 20 45 6e 74 72 6f 70 79 47 61 74  herer EntropyGat
2e460 68 65 72 65 72 3b 0a 73 74 72 75 63 74 20 45 6e  herer;.struct En
2e470 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 7b 0a  tropyGatherer {.
2e480 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e490 2a 61 3b 20 20 20 2f 2a 20 47 61 74 68 65 72 20  *a;   /* Gather 
2e4a0 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 74 68 69  entropy into thi
2e4b0 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
2e4c0 74 20 6e 61 3b 20 20 20 20 20 20 20 20 20 20 20  t na;           
2e4d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d    /* Size of a[]
2e4e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
2e4f0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2e500 20 20 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69     /* XOR next i
2e510 6e 70 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a  nput into a[i] *
2e520 2f 0a 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20  /.  int nXor;   
2e530 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e540 72 20 6f 66 20 58 4f 52 20 6f 70 65 72 61 74 69  r of XOR operati
2e550 6f 6e 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a  ons done */.};..
2e560 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2e570 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
2e580 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e590 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a  T_RANDOMNESS)./*
2e5a0 20 4d 69 78 20 73 7a 20 62 79 74 65 73 20 6f 66   Mix sz bytes of
2e5b0 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e   entropy into p.
2e5c0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
2e5d0 78 6f 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70  xorMemory(Entrop
2e5e0 79 47 61 74 68 65 72 65 72 20 2a 70 2c 20 75 6e  yGatherer *p, un
2e5f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 2c 20  signed char *x, 
2e600 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a  int sz){.  int j
2e610 2c 20 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20  , k;.  for(j=0, 
2e620 6b 3d 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b  k=p->i; j<sz; j+
2e630 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b  +){.    p->a[k++
2e640 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69  ] ^= x[j];.    i
2e650 66 28 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20  f( k>=p->na ) k 
2e660 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20  = 0;.  }.  p->i 
2e670 3d 20 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b  = k;.  p->nXor +
2e680 3d 20 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  = sz;.}.#endif /
2e690 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2e6a0 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
2e6b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2e6c0 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a  RANDOMNESS) */..
2e6d0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
2e6e0 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
2e6f0 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
2e700 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
2e710 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
2e720 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
2e730 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2e740 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20  har *zBuf){.#if 
2e750 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2e760 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
2e770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
2e780 4f 4d 4e 45 53 53 29 0a 20 20 55 4e 55 53 45 44  OMNESS).  UNUSED
2e790 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2e7a0 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
2e7b0 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65 74   0, nBuf);.  ret
2e7c0 75 72 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a  urn nBuf;.#else.
2e7d0 20 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65    EntropyGathere
2e7e0 72 20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  r e;.  UNUSED_PA
2e7f0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2e800 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2e810 20 6e 42 75 66 29 3b 0a 20 20 65 2e 61 20 3d 20   nBuf);.  e.a = 
2e820 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2e830 7a 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e  zBuf;.  e.na = n
2e840 42 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d 20  Buf;.  e.nXor = 
2e850 30 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20 20  0;.  e.i = 0;.  
2e860 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
2e870 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73   x;.    osGetSys
2e880 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20  temTime(&x);.   
2e890 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2e8a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2e8b0 78 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  x, sizeof(SYSTEM
2e8c0 54 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b 0a  TIME));.  }.  {.
2e8d0 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
2e8e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
2e8f0 65 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f 72  essId();.    xor
2e900 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2e910 67 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64 2c  gned char*)&pid,
2e920 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b   sizeof(DWORD));
2e930 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
2e940 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
2e950 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d   ULONGLONG cnt =
2e960 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
2e970 34 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  4();.    xorMemo
2e980 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2e990 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a   char*)&cnt, siz
2e9a0 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29 3b  eof(ULONGLONG));
2e9b0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20  .  }.#else.  {. 
2e9c0 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f     DWORD cnt = o
2e9d0 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b  sGetTickCount();
2e9e0 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2e9f0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2ea00 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  r*)&cnt, sizeof(
2ea10 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65 6e  DWORD));.  }.#en
2ea20 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
2ea30 5f 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20 20  _WINRT */.  {.  
2ea40 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
2ea50 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65  i;.    osQueryPe
2ea60 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
2ea70 28 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  (&i);.    xorMem
2ea80 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2ea90 64 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a 65  d char*)&i, size
2eaa0 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
2eab0 29 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c  ));.  }.#if !SQL
2eac0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2ead0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
2eae0 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
2eaf0 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20 20  _USE_UUID.  {.  
2eb00 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d    UUID id;.    m
2eb10 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69  emset(&id, 0, si
2eb20 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20  zeof(UUID));.   
2eb30 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26 69   osUuidCreate(&i
2eb40 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  d);.    xorMemor
2eb50 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2eb60 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f  char*)&id, sizeo
2eb70 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d 65  f(UUID));.    me
2eb80 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a  mset(&id, 0, siz
2eb90 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20  eof(UUID));.    
2eba0 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75  osUuidCreateSequ
2ebb0 65 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20 20  ential(&id);.   
2ebc0 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2ebd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2ebe0 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29  id, sizeof(UUID)
2ebf0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
2ec00 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
2ec10 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
2ec20 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
2ec30 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20 2a  WIN32_USE_UUID *
2ec40 2f 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58 6f  /.  return e.nXo
2ec50 72 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a 20  r>nBuf ? nBuf : 
2ec60 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20 2f  e.nXor;.#endif /
2ec70 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
2ec80 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
2ec90 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41  d(SQLITE_OMIT_RA
2eca0 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a 0a  NDOMNESS) */.}..
2ecb0 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
2ecc0 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
2ecd0 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
2ece0 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
2ecf0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2ed00 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65   winSleep(sqlite
2ed10 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2ed20 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71   microsec){.  sq
2ed30 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
2ed40 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29  p((microsec+999)
2ed50 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44  /1000);.  UNUSED
2ed60 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2ed70 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63  ;.  return ((mic
2ed80 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
2ed90 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *1000;.}../*.** 
2eda0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
2edb0 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
2edc0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
2edd0 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
2ede0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
2edf0 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
2ee00 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
2ee10 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
2ee20 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
2ee30 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
2ee40 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
2ee50 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
2ee60 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2ee70 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2ee80 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
2ee90 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
2eea0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2eeb0 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
2eec0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2eed0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2eee0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2eef0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2ef00 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
2ef10 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
2ef20 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2ef30 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2ef40 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
2ef50 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
2ef60 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
2ef70 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
2ef80 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
2ef90 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
2efa0 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
2efb0 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
2efc0 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
2efd0 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
2efe0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
2eff0 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
2f000 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
2f010 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
2f020 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
2f030 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
2f040 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
2f050 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a   time and date.*
2f060 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
2f070 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2f080 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2f090 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
2f0a0 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
2f0b0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
2f0c0 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
2f0d0 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
2f0e0 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
2f0f0 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
2f100 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e   of.     100-nan
2f110 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
2f120 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
2f130 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
2f140 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20  05813.5)..  */. 
2f150 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
2f160 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2f170 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
2f180 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
2f190 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
2f1a0 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
2f1b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2f1c0 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
2f1d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
2f1e0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
2f1f0 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
2f200 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
2f210 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
2f220 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
2f230 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
2f240 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
2f250 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2f260 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
2f270 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c  lue =.      (sql
2f280 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
2f290 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
2f2a0 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
2f2b0 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74  0 +.      (sqlit
2f2c0 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32  e3_int64)2949672
2f2d0 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  96;..#if SQLITE_
2f2e0 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45  OS_WINCE.  SYSTE
2f2f0 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73  MTIME time;.  os
2f300 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74  GetSystemTime(&t
2f310 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79  ime);.  /* if Sy
2f320 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
2f330 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72  me() fails, it r
2f340 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eturns zero. */.
2f350 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54    if (!osSystemT
2f360 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74  imeToFileTime(&t
2f370 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72  ime,&ft)){.    r
2f380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2f390 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  OR;.  }.#else.  
2f3a0 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
2f3b0 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29  sFileTime( &ft )
2f3c0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e  ;.#endif..  *piN
2f3d0 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65  ow = winFiletime
2f3e0 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20  Epoch +.        
2f3f0 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f      ((((sqlite3_
2f400 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44  int64)ft.dwHighD
2f410 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69  ateTime)*max32Bi
2f420 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20  tValue) +.      
2f430 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2f440 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
2f450 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
2f460 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
2f470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2f480 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
2f490 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
2f4a0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
2f4b0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2f4c0 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
2f4d0 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
2f4e0 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
2f4f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2f500 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
2f510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f520 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2f530 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2f540 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2f550 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2f560 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
2f570 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2f580 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2f590 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
2f5a0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
2f5b0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
2f5c0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2f5d0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
2f5e0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2f5f0 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
2f600 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
2f610 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
2f620 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Now){.  int rc;.
2f630 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2f640 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72  i;.  rc = winCur
2f650 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56  rentTimeInt64(pV
2f660 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21  fs, &i);.  if( !
2f670 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  rc ){.    *prNow
2f680 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
2f690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f6a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
2f6b0 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
2f6c0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
2f6d0 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
2f6e0 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
2f6f0 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
2f700 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57  atMessage() on W
2f710 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
2f720 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
2f730 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41  _r() on Unix). A
2f740 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
2f750 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
2f760 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
2f770 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
2f780 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
2f790 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
2f7a0 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
2f7b0 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
2f7c0 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
2f7d0 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
2f7e0 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
2f7f0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
2f800 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
2f810 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
2f820 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
2f830 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
2f840 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e   occurred within
2f850 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
2f860 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  thread..**.** If
2f870 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2f880 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
2f890 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64  for the supplied
2f8a0 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73   buffer,.** it s
2f8b0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
2f8c0 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ed. The return v
2f8d0 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74  alue of xGetLast
2f8e0 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  Error.** is zero
2f8f0 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
2f900 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
2f910 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
2f920 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
2f930 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
2f940 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
2f950 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ). If non-zero i
2f960 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74  s returned,.** t
2f970 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hen it is not ne
2f980 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75  cessary to inclu
2f990 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  de the nul-termi
2f9a0 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  nator character.
2f9b0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ** in the output
2f9c0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   buffer..**.** N
2f9d0 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20  ot supplying an 
2f9e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
2f9f0 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72  ll have no adver
2fa00 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20  se effect.** on 
2fa10 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69  SQLite. It is fi
2fa20 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d  ne to have an im
2fa30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
2fa40 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72  t never.** retur
2fa50 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ns an error mess
2fa60 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74  age:.**.**   int
2fa70 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73   xGetLastError(s
2fa80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2fa90 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2faa0 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20   *zBuf){.**     
2fab0 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d  assert(zBuf[0]==
2fac0 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65  '\0');.**     re
2fad0 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a  turn 0;.**   }.*
2fae0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20  *.** However if 
2faf0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2fb00 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74   is supplied, it
2fb10 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f   will be incorpo
2fb20 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  rated.** by sqli
2fb30 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  te into the erro
2fb40 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61  r message availa
2fb50 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20  ble to the user 
2fb60 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
2fb70 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69  _errmsg(), possi
2fb80 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72  bly making IO er
2fb90 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64  rors easier to d
2fba0 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ebug..*/.static 
2fbb0 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
2fbc0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2fbd0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
2fbe0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2fbf0 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c  DWORD e = osGetL
2fc00 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55 4e  astError();.  UN
2fc10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2fc20 56 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75 66  Vfs);.  if( nBuf
2fc30 3e 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74 45  >0 ) winGetLastE
2fc40 72 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66 2c  rrorMsg(e, nBuf,
2fc50 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   zBuf);.  return
2fc60 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   e;.}../*.** Ini
2fc70 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e  tialize and dein
2fc80 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
2fc90 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
2fca0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
2fcb0 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
2fcc0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2fcd0 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56  sqlite3_vfs winV
2fce0 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd00 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2fd10 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2fd20 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73  ile),       /* s
2fd30 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2fd40 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
2fd50 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2fd60 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2fd70 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2fd80 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2fd90 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
2fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fdb0 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26  * zName */.    &
2fdc0 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20 20  winAppData,     
2fdd0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
2fde0 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
2fdf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2fe00 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2fe10 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2fe20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2fe30 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2fe40 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
2fe50 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2fe60 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2fe70 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c  e,       /* xFul
2fe80 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2fe90 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2fea0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2feb0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2fec0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
2fed0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2fee0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2fef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2ff00 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
2ff10 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
2ff20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
2ff30 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
2ff40 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
2ff50 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2ff60 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2ff70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2ff80 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2ff90 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2ffa0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2ffb0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2ffc0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
2ffd0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2ffe0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2fff0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f  ntTimeInt64,   /
30000 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
30010 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
30020 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
30030 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
30040 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
30050 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
30060 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
30070 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
30080 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
30090 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
300a0 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66  Call */.  };.#if
300b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
300c0 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
300d0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
300e0 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68  _vfs winLongPath
300f0 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
30100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30110 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
30120 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
30130 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20  File),       /* 
30140 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
30150 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
30160 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
30170 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
30180 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
30190 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
301a0 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d  t */.    "win32-
301b0 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 20 20  longpath",      
301c0 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
301d0 26 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20  &winAppData,    
301e0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
301f0 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
30200 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
30210 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
30220 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
30230 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
30240 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
30250 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
30260 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
30270 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
30280 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75  me,       /* xFu
30290 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
302a0 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
302b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
302c0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
302d0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
302e0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
302f0 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
30300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
30310 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
30320 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
30330 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
30340 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
30350 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  ness,         /*
30360 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
30370 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
30380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
30390 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
303a0 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
303b0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
303c0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
303d0 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
303e0 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
303f0 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
30400 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20  entTimeInt64,   
30410 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
30420 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
30430 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
30440 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
30450 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
30460 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
30470 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
30480 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
30490 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
304a0 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
304b0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65  mCall */.  };.#e
304c0 6e 64 69 66 0a 20 20 73 74 61 74 69 63 20 73 71  ndif.  static sq
304d0 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4e 6f 6c  lite3_vfs winNol
304e0 6f 63 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  ockVfs = {.    3
304f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30500 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
30510 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
30520 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20  winFile),       
30530 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
30540 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
30550 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20  MAX_PATH_BYTES, 
30560 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
30570 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
30580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
30590 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e  Next */.    "win
305a0 33 32 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20  32-none",       
305b0 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
305c0 20 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70     &winNolockApp
305d0 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 70 41 70  Data,     /* pAp
305e0 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
305f0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
30600 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
30610 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
30620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
30630 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
30640 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
30650 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
30660 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
30670 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20  hname,       /* 
30680 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
30690 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
306a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
306b0 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
306c0 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
306d0 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
306e0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
306f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30700 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
30710 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
30720 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
30730 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
30740 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20  domness,        
30750 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
30760 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
30770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30780 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
30790 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
307a0 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
307b0 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
307c0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
307d0 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
307e0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
307f0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
30800 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
30810 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
30820 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
30830 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73        /* xSetSys
30840 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
30850 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inGetSystemCall,
30860 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73        /* xGetSys
30870 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
30880 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
30890 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ,     /* xNextSy
308a0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
308b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
308c0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
308d0 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c  DE).  static sql
308e0 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67  ite3_vfs winLong
308f0 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20  PathNolockVfs = 
30900 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
30910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30920 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
30930 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
30940 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
30950 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45  le */.    SQLITE
30960 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
30970 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68  BYTES, /* mxPath
30980 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
30990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309a0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
309b0 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61     "win32-longpa
309c0 74 68 2d 6e 6f 6e 65 22 2c 20 2f 2a 20 7a 4e 61  th-none", /* zNa
309d0 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f  me */.    &winNo
309e0 6c 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20 20  lockAppData,    
309f0 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
30a00 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
30a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
30a20 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
30a30 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
30a40 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
30a50 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
30a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
30a70 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
30a80 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
30a90 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
30aa0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
30ab0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
30ac0 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
30ad0 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
30af0 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
30b00 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
30b10 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
30b20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
30b30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
30b40 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
30b50 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
30b60 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64          /* xRand
30b70 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
30b80 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
30b90 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
30ba0 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
30bb0 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Time,        /* 
30bc0 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
30bd0 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
30be0 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47  ror,       /* xG
30bf0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
30c00 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
30c10 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75  eInt64,   /* xCu
30c20 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
30c30 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
30c40 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  emCall,      /* 
30c50 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
30c60 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
30c70 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  emCall,      /* 
30c80 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
30c90 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
30ca0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20  temCall,     /* 
30cb0 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
30cc0 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a  */.  };.#endif..
30cd0 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63    /* Double-chec
30ce0 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63  k that the aSysc
30cf0 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20  all[] array has 
30d00 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
30d10 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e  .  ** correctly.
30d20 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62    See ticket [bb
30d30 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d  3a86e890c8e96ab]
30d40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72   */.  assert( Ar
30d50 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
30d60 29 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20 67  )==80 );..  /* g
30d70 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c  et memory map al
30d80 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61  location granula
30d90 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  rity */.  memset
30da0 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c  (&winSysInfo, 0,
30db0 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49   sizeof(SYSTEM_I
30dc0 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54  NFO));.#if SQLIT
30dd0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47  E_OS_WINRT.  osG
30de0 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
30df0 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
30e00 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
30e10 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
30e20 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Info);.#endif.  
30e30 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
30e40 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
30e50 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a  ranularity>0 );.
30e60 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
30e70 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e  Info.dwPageSize>
30e80 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  0 );..  sqlite3_
30e90 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
30ea0 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64  nVfs, 1);..#if d
30eb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
30ec0 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
30ed0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
30ee0 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74  ster(&winLongPat
30ef0 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  hVfs, 0);.#endif
30f00 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ..  sqlite3_vfs_
30f10 72 65 67 69 73 74 65 72 28 26 77 69 6e 4e 6f 6c  register(&winNol
30f20 6f 63 6b 56 66 73 2c 20 30 29 3b 0a 0a 23 69 66  ockVfs, 0);..#if
30f30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
30f40 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
30f50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
30f60 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50  gister(&winLongP
30f70 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30 29  athNolockVfs, 0)
30f80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
30f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30fa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
30fb0 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20 53  end(void){.#if S
30fc0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
30fd0 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e   if( sleepObj!=N
30fe0 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f  ULL ){.    osClo
30ff0 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62  seHandle(sleepOb
31000 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a  j);.    sleepObj
31010 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e   = NULL;.  }.#en
31020 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
31030 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
31040 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
31050 49 4e 20 2a 2f 0a                                IN */.