/ Hex Artifact Content
Login

Artifact 8ba3403e276b0b01fd822bfcc162b83cacc80a1a:


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 28 54 52 55 45 29 0a 23 65  ATE    (TRUE).#e
2d20: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73  ndif../*. * This
2d30: 20 69 73 20 63 61 63 68 65 20 73 69 7a 65 20 75   is cache size u
2d40: 73 65 64 20 69 6e 20 74 68 65 20 63 61 6c 63 75  sed in the calcu
2d50: 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  lation of the in
2d60: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
2d70: 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70 65 63 69  e. * Win32-speci
2d80: 66 69 63 20 68 65 61 70 2e 20 20 49 74 20 63 61  fic heap.  It ca
2d90: 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65  nnot be negative
2da0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2db0: 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48 45  LITE_WIN32_CACHE
2dc0: 5f 53 49 5a 45 0a 23 20 20 69 66 20 53 51 4c 49  _SIZE.#  if SQLI
2dd0: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
2de0: 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20 20 64 65  _SIZE>=0.#    de
2df0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2e00: 32 5f 43 41 43 48 45 5f 53 49 5a 45 20 28 53 51  2_CACHE_SIZE (SQ
2e10: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
2e20: 48 45 5f 53 49 5a 45 29 0a 23 20 20 65 6c 73 65  HE_SIZE).#  else
2e30: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
2e40: 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f  ITE_WIN32_CACHE_
2e50: 53 49 5a 45 20 28 2d 28 53 51 4c 49 54 45 5f 44  SIZE (-(SQLITE_D
2e60: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
2e70: 45 29 29 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E)).#  endif.#en
2e80: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  dif../*. * The i
2e90: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
2ea0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
2eb0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
2ec0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
2ed0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2ee0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
2ef0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
2f00: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2f10: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28  HEAP_INIT_SIZE (
2f20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41  (SQLITE_WIN32_CA
2f30: 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20  CHE_SIZE) * \.  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46       (SQLITE_DEF
2f70: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20  AULT_PAGE_SIZE) 
2f80: 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69  + 4194304).#endi
2f90: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78  f../*. * The max
2fa0: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
2fb0: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20   Win32-specific 
2fc0: 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75  heap.  This valu
2fd0: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20  e may be zero.. 
2fe0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2ff0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
3000: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
3010: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
3020: 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a  P_MAX_SIZE  (0).
3030: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
3040: 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f  e extra flags to
3050: 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f   use in calls to
3060: 20 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20   the Win32 heap 
3070: 41 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75  APIs.  This valu
3080: 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f  e may be. * zero
3090: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
30a0: 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23   behavior.. */.#
30b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
30c0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23  N32_HEAP_FLAGS.#
30d0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
30e0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
30f0: 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a       (0).#endif.
3100: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d  ../*.** The winM
3110: 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65  emData structure
3120: 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74   stores informat
3130: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
3140: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
3150: 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65  ic.** sqlite3_me
3160: 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d  m_methods implem
3170: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  entation..*/.typ
3180: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d  edef struct winM
3190: 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74  emData winMemDat
31a0: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  a;.struct winMem
31b0: 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e  Data {.#ifndef N
31c0: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
31d0: 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c1;   /* Magic n
31e0: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
31f0: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
3200: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
3210: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20    HANDLE hHeap; 
3220: 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  /* The handle to
3230: 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20   our heap. */.  
3240: 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a  BOOL bOwned;  /*
3250: 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68   Do we own the h
3260: 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f  eap (i.e. destro
3270: 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e  y it on shutdown
3280: 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )? */.#ifndef ND
3290: 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63  EBUG.  u32 magic
32a0: 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75  2;   /* Magic nu
32b0: 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73  mber to detect s
32c0: 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
32d0: 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  ion. */.#endif.}
32e0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
32f0: 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  G.#define WINMEM
3300: 5f 4d 41 47 49 43 31 20 20 20 20 20 30 78 34 32  _MAGIC1     0x42
3310: 62 32 38 33 30 62 0a 23 64 65 66 69 6e 65 20 57  b2830b.#define W
3320: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20 20  INMEM_MAGIC2    
3330: 20 30 78 62 64 34 64 37 63 66 34 0a 23 65 6e 64   0xbd4d7cf4.#end
3340: 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  if..static struc
3350: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
3360: 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69  _mem_data = {.#i
3370: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57  fndef NDEBUG.  W
3380: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65  INMEM_MAGIC1,.#e
3390: 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c  ndif.  NULL, FAL
33a0: 53 45 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  SE.#ifndef NDEBU
33b0: 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49  G.  ,WINMEM_MAGI
33c0: 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69  C2.#endif.};..#i
33d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
33e0: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
33f0: 74 4d 61 67 69 63 31 28 29 20 61 73 73 65 72 74  tMagic1() assert
3400: 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d  ( win_mem_data.m
3410: 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic1==WINMEM_MA
3420: 47 49 43 31 20 29 0a 23 64 65 66 69 6e 65 20 77  GIC1 ).#define w
3430: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3440: 32 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  2() assert( win_
3450: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d  mem_data.magic2=
3460: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29  =WINMEM_MAGIC2 )
3470: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
3480: 73 73 65 72 74 4d 61 67 69 63 28 29 20 20 77 69  ssertMagic()  wi
3490: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31  nMemAssertMagic1
34a0: 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  (); winMemAssert
34b0: 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a  Magic2();.#else.
34c0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
34d0: 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64  sertMagic().#end
34e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  if..#define winM
34f0: 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 20 20  emGetDataPtr()  
3500: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64  &win_mem_data.#d
3510: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48  efine winMemGetH
3520: 65 61 70 28 29 20 20 20 20 20 77 69 6e 5f 6d 65  eap()     win_me
3530: 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 23 64 65  m_data.hHeap.#de
3540: 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77  fine winMemGetOw
3550: 6e 65 64 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d  ned()    win_mem
3560: 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74  _data.bOwned..st
3570: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
3580: 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  mMalloc(int nByt
3590: 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  es);.static void
35a0: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
35b0: 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69   *pPrior);.stati
35c0: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
35d0: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
35e0: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b  or, int nBytes);
35f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
3600: 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b  emSize(void *p);
3610: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
3620: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
3630: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
3640: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
3650: 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20  ppData);.static 
3660: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
3670: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
3680: 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69  ta);..const sqli
3690: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
36a0: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
36b0: 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  n32(void);.#endi
36c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
36d0: 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a  2_MALLOC */../*.
36e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
36f0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f   variable is (no
3700: 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65  rmally) set once
3710: 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67   and never chang
3720: 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72  es.** thereafter
3730: 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68  .  It records wh
3740: 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74  ether the operat
3750: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
3760: 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e  n9x.** or WinNT.
3770: 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72  .**.** 0:   Oper
3780: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b  ating system unk
3790: 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70  nown..** 1:   Op
37a0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
37b0: 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20  s Win9x..** 2:  
37c0: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
37d0: 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  m is WinNT..**.*
37e0: 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  * In order to fa
37f0: 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67  cilitate testing
3800: 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74   on a WinNT syst
3810: 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78  em, the test fix
3820: 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75  ture.** can manu
3830: 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61  ally set this va
3840: 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c  lue to 1 to emul
3850: 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69  ate Win98 behavi
3860: 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  or..*/.#ifdef SQ
3870: 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e 47 20 53  LITE_TEST.LONG S
3880: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
3890: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
38a0: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  type = 0;.#else.
38b0: 73 74 61 74 69 63 20 4c 4f 4e 47 20 53 51 4c 49  static LONG SQLI
38c0: 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c  TE_WIN32_VOLATIL
38d0: 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  E sqlite3_os_typ
38e0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
38f0: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
3900: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
3910: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3920: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
3930: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3940: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
3950: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
3960: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
3970: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3980: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
3990: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
39a0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
39b0: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
39c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
39d0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
39e0: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
39f0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
3a00: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
3a10: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
3a20: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
3a30: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
3a40: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
3a50: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
3a60: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
3a70: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
3a80: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
3a90: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
3aa0: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
3ab0: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
3ac0: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
3ad0: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
3ae0: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
3af0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3b10: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3b20: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3b30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
3b40: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
3b50: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
3b60: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
3b70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b80: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
3b90: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
3ba0: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
3bb0: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
3bc0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
3bd0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
3be0: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
3bf0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3c00: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
3c10: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
3c20: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
3c30: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
3c40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3c50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3c60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3c70: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
3c80: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
3c90: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
3ca0: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
3cb0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3cc0: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
3cd0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
3ce0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3cf0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3d00: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3d10: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
3d20: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
3d30: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
3d40: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
3d50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3d60: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
3d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3d80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3db0: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
3dc0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
3dd0: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
3de0: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
3df0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
3e00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3e10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3e20: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3e30: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
3e40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3e50: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
3e60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e70: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
3e80: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3e90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ec0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
3ed0: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
3ee0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
3ef0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
3f00: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
3f10: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
3f20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3f30: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
3f40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3f50: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
3f60: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
3f70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
3f80: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3f90: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3fa0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3fb0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
3fc0: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3fd0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3fe0: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
3ff0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4000: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
4010: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
4020: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4050: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
4060: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
4070: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
4080: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
4090: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
40a0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
40b0: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
40c0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
40d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
40e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
40f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4100: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4110: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
4120: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
4130: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
4140: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
4150: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4160: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
4170: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4180: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
41a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
41b0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
41c0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
41d0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
41e0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
41f0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
4200: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
4210: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
4220: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
4230: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4240: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4250: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4260: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20  HAS_ANSI) && \. 
4270: 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65 64         (!defined
4280: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4290: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
42a0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20 26 26 20  MMAP_SIZE>0) && 
42b0: 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  \.        SQLITE
42c0: 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c  _WIN32_CREATEFIL
42d0: 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b 20 22 43  EMAPPINGA.  { "C
42e0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
42f0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
4300: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
4310: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
4320: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
4330: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
4340: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4370: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
4380: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
4390: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
43a0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55  *)(HANDLE,LPSECU
43b0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
43c0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
43d0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43  ,DWORD,DWORD,LPC
43e0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  STR))aSyscall[6]
43f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4400: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4410: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
4420: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4430: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4440: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
4450: 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
4460: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
4470: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
4480: 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22  P_SIZE>0)).  { "
4490: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
44a0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
44b0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
44c0: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
44d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
44e0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
44f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4510: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4520: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
4530: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4540: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
4550: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
4560: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
4570: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
4580: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4590: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
45a0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
45b0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
45c0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
45d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
45e0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
45f0: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
4600: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
4610: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
4620: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4630: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
4640: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
4650: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4680: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
4690: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
46a0: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
46b0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
46c0: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
46d0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
46e0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
46f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4700: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4710: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
4720: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
4730: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
4740: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
4750: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4760: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
4770: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4780: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
47a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
47b0: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
47c0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
47d0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
47e0: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
47f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4800: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4810: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
4820: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
4830: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
4840: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
4850: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4860: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
4870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4880: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
48b0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
48c0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
48d0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
48e0: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
48f0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
4900: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
4910: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4920: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
4930: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
4940: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
4950: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4960: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4970: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
49a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
49b0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
49c0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
49d0: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
49e0: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
49f0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
4a00: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
4a10: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
4a20: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
4a30: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4a40: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46  ",    (SYSCALL)F
4a50: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
4a60: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ime,    0 },.#el
4a70: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
4a80: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
4a90: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4ac0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
4ad0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20  imeToSystemTime 
4ae0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4af0: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
4b00: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
4b10: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
4b20: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
4b30: 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42  .  { "FlushFileB
4b40: 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20  uffers",        
4b50: 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69  (SYSCALL)FlushFi
4b60: 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20  leBuffers,      
4b70: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4b80: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
4b90: 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  rs ((BOOL(WINAPI
4ba0: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
4bb0: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
4bc0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4bd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4be0: 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61  ANSI).  { "Forma
4bf0: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
4c00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
4c10: 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20  rmatMessageA,   
4c20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4c30: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
4c40: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
4c50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4c80: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
4c90: 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44  MessageA ((DWORD
4ca0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4cb0: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4cc0: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
4cd0: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
4ce0: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  st*))aSyscall[14
4cf0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4d00: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4d10: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4d20: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4d30: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
4d40: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
4d50: 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20  ssageW,         
4d60: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4d70: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
4d80: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4d90: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4db0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4dc0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
4dd0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
4de0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
4df0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4e00: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4e10: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
4e20: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
4e30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4e50: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
4e60: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72  .  { "FreeLibrar
4e70: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
4e80: 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62  (SYSCALL)FreeLib
4e90: 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 20  rary,           
4ea0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4eb0: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4ed0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4ef0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4f00: 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  ne osFreeLibrary
4f10: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4f20: 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61  (HMODULE))aSysca
4f30: 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[16].pCurrent)
4f40: 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e  ..  { "GetCurren
4f50: 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20  tProcessId",    
4f60: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72   (SYSCALL)GetCur
4f70: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20  rentProcessId,  
4f80: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4f90: 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
4fa0: 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57  cessId ((DWORD(W
4fb0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
4fc0: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
4fd0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4fe0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4ff0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5000: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
5010: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
5020: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
5030: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65  CALL)GetDiskFree
5040: 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30 20  SpaceA,       0 
5050: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5060: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
5070: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
5080: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
50a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
50b0: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  sGetDiskFreeSpac
50c0: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
50d0: 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52  *)(LPCSTR,LPDWOR
50e0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
50f0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
5100: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
5110: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
5120: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5130: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
5140: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
5150: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5160: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
5170: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
5180: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
5190: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
51a0: 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eW,       0 },.#
51b0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
51c0: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
51d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5200: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5210: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28  DiskFreeSpaceW (
5220: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
5230: 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  PCWSTR,LPDWORD,L
5240: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
5250: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
5260: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  D))aSyscall[19].
5270: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5280: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5290: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
52a0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
52b0: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
52c0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
52d0: 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30  ributesA,      0
52e0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
52f0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5300: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
5310: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5320: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5330: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5340: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
5350: 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e  tesA ((DWORD(WIN
5360: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
5370: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
5380: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5390: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
53a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
53b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
53c0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
53d0: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53  tesW",      (SYS
53e0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
53f0: 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30 20  ibutesW,      0 
5400: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5410: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
5420: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
5430: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5440: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5450: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5460: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
5470: 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esW ((DWORD(WINA
5480: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
5490: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
54a0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
54b0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
54c0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
54d0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
54e0: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  xW",    (SYSCALL
54f0: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
5500: 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23  esExW,    0 },.#
5510: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
5520: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
5530: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5560: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5570: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
5580: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
5590: 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49  )(LPCWSTR,GET_FI
55a0: 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53  LEEX_INFO_LEVELS
55b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f  , \.        LPVO
55c0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  ID))aSyscall[22]
55d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
55e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
55f0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
5600: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5610: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
5620: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
5630: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5640: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
5650: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5660: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5680: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5690: 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65  ne osGetFileSize
56a0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
56b0: 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44  )(HANDLE,LPDWORD
56c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
56d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
56e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
56f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5700: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5710: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5720: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
5730: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5740: 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20  PathNameA,      
5750: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5760: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5770: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
5780: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
57a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
57b0: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
57c0: 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49  NameA ((DWORD(WI
57d0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
57e0: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
57f0: 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79       LPSTR*))aSy
5800: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
5810: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5820: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
5830: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5840: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5850: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5860: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
5870: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
5880: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
5890: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
58a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
58b0: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
58c0: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
58d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
58f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5900: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
5910: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
5920: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
5930: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
5940: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
5950: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
5960: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
5970: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
5980: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5990: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
59a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
59b0: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
59c0: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
59d0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
59e0: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
59f0: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
5a00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
5a10: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66  D_EXTENSION).#if
5a20: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
5a30: 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f  .  /* The GetPro
5a40: 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74  cAddressA() rout
5a50: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ine is only avai
5a60: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
5a70: 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74   CE. */.  { "Get
5a80: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
5a90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5aa0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c  GetProcAddressA,
5ab0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5ac0: 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
5ad0: 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  er Windows platf
5ae0: 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
5af0: 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
5b00: 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53  take.  ** an ANS
5b10: 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  I string regardl
5b20: 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
5b30: 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
5b40: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
5b50: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
5b60: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
5b70: 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  dress,          
5b80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73  0 },.#endif.#els
5b90: 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  e.  { "GetProcAd
5ba0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
5bb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5be0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
5bf0: 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50  cAddressA ((FARP
5c00: 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  ROC(WINAPI*)(HMO
5c10: 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  DULE, \.        
5c20: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
5c30: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
5c40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5c50: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73  INRT.  { "GetSys
5c60: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
5c70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5c80: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
5c90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5ca0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
5cb0: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
5cc0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5cf0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
5d00: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
5d10: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f  NAPI*)(LPSYSTEM_
5d20: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32  INFO))aSyscall[2
5d30: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
5d40: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5d50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d60: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5d70: 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ime,           0
5d80: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
5d90: 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56  etSystemTime ((V
5da0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5db0: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
5dc0: 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74  all[29].pCurrent
5dd0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5de0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74  S_WINCE.  { "Get
5df0: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5e00: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
5e10: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5e20: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
5e30: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
5e40: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
5e50: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5e80: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5e90: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5ea0: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
5eb0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5ec0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
5ed0: 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74  all[30].pCurrent
5ee0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
5ef0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5f00: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65  ANSI).  { "GetTe
5f10: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20  mpPathA",       
5f20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5f30: 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20  tTempPathA,     
5f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5f50: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
5f60: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
5f70: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5fa0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
5fb0: 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 57  pPathA ((DWORD(W
5fc0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
5fd0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31  STR))aSyscall[31
5fe0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ff0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6000: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
6010: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
6020: 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  DE).  { "GetTemp
6030: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20  PathW",         
6040: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
6050: 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20  empPathW,       
6060: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6070: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
6080: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
6090: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
60c0: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
60d0: 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e  athW ((DWORD(WIN
60e0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53  API*)(DWORD,LPWS
60f0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d  TR))aSyscall[32]
6100: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6110: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6120: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
6130: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
6140: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
6150: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
6160: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6170: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
6180: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6190: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
61b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
61c0: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
61d0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
61e0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
61f0: 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[33].pCurrent).
6200: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6210: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6220: 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49  SI) && SQLITE_WI
6230: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
6240: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
6250: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
6260: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
6270: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
6280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6290: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
62a0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
62b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
62d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
62e0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
62f0: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
6300: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
6310: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
6320: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
6330: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6340: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6350: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6360: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
6370: 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  & \.        SQLI
6380: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
6390: 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65  IONEX.  { "GetVe
63a0: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20  rsionExW",      
63b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
63c0: 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20 20  tVersionExW,    
63d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
63e0: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  e.  { "GetVersio
63f0: 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  nExW",          
6400: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6430: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72  #define osGetVer
6440: 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57  sionExW ((BOOL(W
6450: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
6460: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e     LPOSVERSIONIN
6470: 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33 35  FOW))aSyscall[35
6480: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6490: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20   "HeapAlloc",   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
64b0: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20  CALL)HeapAlloc, 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
64d0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
64e0: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  apAlloc ((LPVOID
64f0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6500: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6510: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
6520: 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[36].pCurrent)
6530: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6540: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
6550: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
6560: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6570: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20  eapCreate,      
6580: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6590: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  se.  { "HeapCrea
65a0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
65b0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
65e0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
65f0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
6600: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
6610: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
6620: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6630: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [37].pCurrent)..
6640: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6650: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65  INRT.  { "HeapDe
6660: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
6670: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6680: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
6690: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
66a0: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
66b0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
66c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
66f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73  define osHeapDes
6700: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  troy ((BOOL(WINA
6710: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
6720: 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65  scall[38].pCurre
6730: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72  nt)..  { "HeapFr
6740: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
6750: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6760: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  pFree,          
6770: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6780: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28  ine osHeapFree (
6790: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
67a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
67b0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d  ID))aSyscall[39]
67c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
67d0: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20  "HeapReAlloc",  
67e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67f0: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c  ALL)HeapReAlloc,
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6810: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6820: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  pReAlloc ((LPVOI
6830: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
6840: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20  E,DWORD,LPVOID, 
6850: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6860: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
6870: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
6880: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20  eapSize",       
6890: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
68a0: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20  L)HeapSize,     
68b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
68c0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53  .#define osHeapS
68d0: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e  ize ((SIZE_T(WIN
68e0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
68f0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6900: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
6910: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  41].pCurrent)..#
6920: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6930: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  NRT.  { "HeapVal
6940: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
6950: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6960: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20  Validate,       
6970: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6980: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
6990: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
69a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
69d0: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
69e0: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
69f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6a00: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
6a10: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
6a20: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
6a30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6a40: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
6a50: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
6a60: 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20  Compact",       
6a70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6a80: 65 61 70 43 6f 6d 70 61 63 74 2c 20 20 20 20 20  eapCompact,     
6a90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6aa0: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70  se.  { "HeapComp
6ab0: 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  act",           
6ac0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6af0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
6b00: 6f 6d 70 61 63 74 20 28 28 55 49 4e 54 28 57 49  ompact ((UINT(WI
6b10: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6b20: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 33  ORD))aSyscall[43
6b30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6b40: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6b50: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
6b60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6b70: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6b80: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6b90: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
6ba0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6bb0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20  LoadLibraryA,   
6bc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6bd0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6be0: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
6bf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6c20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6c30: 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55  LibraryA ((HMODU
6c40: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
6c50: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d  TR))aSyscall[44]
6c60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6c70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6c80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
6c90: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
6ca0: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
6cb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6cc0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
6cd0: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  ION).  { "LoadLi
6ce0: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
6d00: 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20  dLibraryW,      
6d10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6d20: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
6d30: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
6d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6d70: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62  define osLoadLib
6d80: 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28  raryW ((HMODULE(
6d90: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
6da0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70  ))aSyscall[45].p
6db0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6dc0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6dd0: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6df0: 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65  YSCALL)LocalFree
6e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6e10: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6e20: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
6e30: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6e40: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6e60: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6e70: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
6e80: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
6e90: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
6ea0: 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  46].pCurrent)..#
6eb0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6ec0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
6ed0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
6ee0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6ef0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6f00: 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  LockFile,       
6f10: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6f20: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
6f30: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6f40: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6f70: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
6f80: 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c  File.#define osL
6f90: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
6fa0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6fb0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6fc0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
6fd0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e  D))aSyscall[47].
6fe0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
6ff0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7000: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b  _WINCE.  { "Lock
7010: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
7020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
7030: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
7040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7050: 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  se.  { "LockFile
7060: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
7070: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
70a0: 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46  .#ifndef osLockF
70b0: 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73  ileEx.#define os
70c0: 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  LockFileEx ((BOO
70d0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
70e0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
70f0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
7100: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
7110: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e  D))aSyscall[48].
7120: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
7130: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7140: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
7150: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a  E_OS_WINRT && \.
7160: 20 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65          (!define
7170: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7180: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
7190: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20  _MMAP_SIZE>0)). 
71a0: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
71b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
71c0: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
71d0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
71e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
71f0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
7200: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7210: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7220: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7230: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7240: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
7250: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
7260: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7270: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7280: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
7290: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
72a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74  rent)..  { "Mult
72b0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22  iByteToWideChar"
72c0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ,     (SYSCALL)M
72d0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
72e0: 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ar,     0 },..#d
72f0: 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74  efine osMultiByt
7300: 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e  eToWideChar ((in
7310: 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c  t(WINAPI*)(UINT,
7320: 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74  DWORD,LPCSTR,int
7330: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
7340: 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c     int))aSyscall
7350: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
7360: 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72    { "QueryPerfor
7370: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28  manceCounter", (
7380: 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72  SYSCALL)QueryPer
7390: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c  formanceCounter,
73a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
73b0: 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
73c0: 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28  eCounter ((BOOL(
73d0: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
73e0: 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
73f0: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  R*))aSyscall[51]
7400: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7410: 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20  "ReadFile",     
7420: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7430: 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20  ALL)ReadFile,   
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7450: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  ,..#define osRea
7460: 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  dFile ((BOOL(WIN
7470: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56  API*)(HANDLE,LPV
7480: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
7490: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
74a0: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
74b0: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
74c0: 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66  )..  { "SetEndOf
74d0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
74e0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e    (SYSCALL)SetEn
74f0: 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  dOfFile,        
7500: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
7510: 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  e osSetEndOfFile
7520: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7530: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
7540: 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[53].pCurrent).
7550: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
7560: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
7570: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
7580: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7590: 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20  tFilePointer,   
75a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
75b0: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
75c0: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
75d0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7600: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
7610: 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44  ePointer ((DWORD
7620: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7630: 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20  ,LONG,PLONG, \. 
7640: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7650: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
7660: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7670: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7680: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
7690: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
76a0: 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20  LL)Sleep,       
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
76c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65  .#else.  { "Slee
76d0: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
76e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
76f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7700: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7710: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
7720: 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41  leep ((VOID(WINA
7730: 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73  PI*)(DWORD))aSys
7740: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
7750: 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54  t)..  { "SystemT
7760: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20  imeToFileTime", 
7770: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74     (SYSCALL)Syst
7780: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
7790: 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ,    0 },..#defi
77a0: 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54  ne osSystemTimeT
77b0: 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  oFileTime ((BOOL
77c0: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
77d0: 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20  SYSTEMTIME*, \. 
77e0: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
77f0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e  E))aSyscall[56].
7800: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7810: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7820: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
7830: 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NRT.  { "UnlockF
7840: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7850: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
7860: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
7870: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7880: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
7890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
78a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
78d0: 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69  fndef osUnlockFi
78e0: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  le.#define osUnl
78f0: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
7900: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7910: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7920: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7930: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
7940: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
7950: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7960: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f  _WINCE.  { "Unlo
7970: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
7980: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
7990: 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  nlockFileEx,    
79a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
79b0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
79c0: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
79d0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7a00: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
7a10: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
7a20: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7a30: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7a40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
7a50: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
7a60: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
7a70: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7a80: 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65  WINCE || !define
7a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7aa0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
7ab0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
7ac0: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
7ad0: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
7ae0: 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66  CALL)UnmapViewOf
7af0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20  File,         0 
7b00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
7b10: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
7b20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7b30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7b40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7b50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7b60: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
7b70: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7b80: 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61  (LPCVOID))aSysca
7b90: 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[59].pCurrent)
7ba0: 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72 54  ..  { "WideCharT
7bb0: 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20  oMultiByte",    
7bc0: 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68   (SYSCALL)WideCh
7bd0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20  arToMultiByte,  
7be0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
7bf0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
7c00: 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e  tiByte ((int(WIN
7c10: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
7c20: 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53  ,LPCWSTR,int,LPS
7c30: 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20  TR,int, \.      
7c40: 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29    LPCSTR,LPBOOL)
7c50: 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43  )aSyscall[60].pC
7c60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72  urrent)..  { "Wr
7c70: 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20  iteFile",       
7c80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7c90: 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20  )WriteFile,     
7ca0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
7cb0: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46  #define osWriteF
7cc0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
7cd0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f  I*)(HANDLE,LPCVO
7ce0: 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ID,DWORD,LPDWORD
7cf0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
7d00: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
7d10: 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[61].pCurrent)
7d20: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7d30: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
7d40: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
7d50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
7d60: 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20  eateEventExW,   
7d70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7d80: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  e.  { "CreateEve
7d90: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
7da0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7dd0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
7de0: 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c  EventExW ((HANDL
7df0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
7e00: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
7e10: 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  ,LPCWSTR, \.    
7e20: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29      DWORD,DWORD)
7e30: 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43  )aSyscall[62].pC
7e40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
7e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7e60: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
7e70: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
7e80: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
7e90: 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30  gleObject,     0
7ea0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
7eb0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7ec0: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
7ed0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7ee0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7ef0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7f00: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
7f10: 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57 49  bject ((DWORD(WI
7f20: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
7f30: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7f40: 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75  aSyscall[63].pCu
7f50: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7f60: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
7f70: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7f80: 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53  bjectEx",   (SYS
7f90: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
7fa0: 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20  leObjectEx,   0 
7fb0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61  },.#else.  { "Wa
7fc0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
7fd0: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
7fe0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7ff0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8000: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8010: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
8020: 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57  jectEx ((DWORD(W
8030: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
8040: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
8050: 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36  BOOL))aSyscall[6
8060: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
8070: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8080: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
8090: 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20  interEx",       
80a0: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
80b0: 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20  ePointerEx,     
80c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
80d0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
80e0: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
80f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8110: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8120: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
8130: 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49  nterEx ((BOOL(WI
8140: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41  NAPI*)(HANDLE,LA
8150: 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20  RGE_INTEGER, \. 
8160: 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e         PLARGE_IN
8170: 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79  TEGER,DWORD))aSy
8180: 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65  scall[65].pCurre
8190: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
81a0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
81b0: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
81c0: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
81d0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66  SCALL)GetFileInf
81e0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
81f0: 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  Ex, 0 },.#else. 
8200: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
8210: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
8220: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8250: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e  fine osGetFileIn
8260: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8270: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
8280: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
8290: 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f        FILE_INFO_
82a0: 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c  BY_HANDLE_CLASS,
82b0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53  LPVOID,DWORD))aS
82c0: 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72  yscall[66].pCurr
82d0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
82e0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64  _OS_WINRT && (!d
82f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8300: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
8310: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
8320: 30 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  0).  { "MapViewO
8330: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
8340: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
8350: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c  ewOfFileFromApp,
8360: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8370: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
8380: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
8390: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
83c0: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
83d0: 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50  FileFromApp ((LP
83e0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
83f0: 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  NDLE,ULONG,ULONG
8400: 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  64, \.        SI
8410: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36  ZE_T))aSyscall[6
8420: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
8430: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8440: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  T.  { "CreateFil
8450: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
8460: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
8470: 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20  File2,          
8480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8490: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
84b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
84d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
84e0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
84f0: 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  2 ((HANDLE(WINAP
8500: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
8510: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
8520: 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54  .        LPCREAT
8530: 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
8540: 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73  PARAMETERS))aSys
8550: 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e  call[68].pCurren
8560: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
8570: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
8580: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8590: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
85a0: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
85b0: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
85c0: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b  SYSCALL)LoadPack
85d0: 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20  agedLibrary,    
85e0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
85f0: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
8600: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
8610: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8630: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8640: 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  e osLoadPackaged
8650: 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c  Library ((HMODUL
8660: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
8670: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
8680: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39  ORD))aSyscall[69
8690: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
86a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
86b0: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
86c0: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
86d0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
86e0: 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20  Count64,        
86f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8700: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
8710: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8720: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8740: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8750: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
8760: 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28  t64 ((ULONGLONG(
8770: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
8780: 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72  Syscall[70].pCur
8790: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
87a0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
87b0: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
87c0: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
87d0: 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74  LL)GetNativeSyst
87e0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c  emInfo,     0 },
87f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e  .#else.  { "GetN
8800: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
8810: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8820: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8830: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8840: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
8850: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8860: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
8870: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
8880: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
8890: 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65  scall[71].pCurre
88a0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
88b0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
88c0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74  S_ANSI).  { "Out
88d0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
88e0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
88f0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8900: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
8910: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
8920: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
8930: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8960: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
8970: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28  utDebugStringA (
8980: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
8990: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
89a0: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  72].pCurrent)..#
89b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
89c0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
89d0: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
89e0: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
89f0: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8a00: 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20  DebugStringW,   
8a10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8a20: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
8a30: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
8a40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8a60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8a70: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8a80: 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28  gStringW ((VOID(
8a90: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
8aa0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70  ))aSyscall[73].p
8ab0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
8ac0: 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20  etProcessHeap", 
8ad0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
8ae0: 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  L)GetProcessHeap
8af0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
8b00: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
8b10: 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44  ocessHeap ((HAND
8b20: 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  LE(WINAPI*)(VOID
8b30: 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70  ))aSyscall[74].p
8b40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
8b50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
8b60: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
8b70: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
8b80: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
8b90: 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43 72 65 61  IZE>0).  { "Crea
8ba0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
8bb0: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
8bc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8bd0: 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23  gFromApp, 0 },.#
8be0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
8bf0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
8c00: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  pp", (SYSCALL)0,
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8c30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
8c40: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8c50: 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57  omApp ((HANDLE(W
8c60: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
8c70: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
8c80: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
8c90: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50  ULONG,ULONG64,LP
8ca0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
8cb0: 37 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  75].pCurrent)../
8cc0: 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e 20 73 6f  *.** NOTE: On so
8cd0: 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73  me sub-platforms
8ce0: 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f 63 6b 65  , the Interlocke
8cf0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8d00: 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a 2a 20 20   "function".**  
8d10: 20 20 20 20 20 69 73 20 72 65 61 6c 6c 79 20 6a       is really j
8d20: 75 73 74 20 61 20 6d 61 63 72 6f 20 74 68 61 74  ust a macro that
8d30: 20 75 73 65 73 20 61 20 63 6f 6d 70 69 6c 65 72   uses a compiler
8d40: 20 69 6e 74 72 69 6e 73 69 63 20 28 65 2e 67 2e   intrinsic (e.g.
8d50: 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20 20 20 20   x64)..**       
8d60: 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f  So do not try to
8d70: 20 6d 61 6b 65 20 74 68 69 73 20 69 73 20 69 6e   make this is in
8d80: 74 6f 20 61 20 72 65 64 65 66 69 6e 61 62 6c 65  to a redefinable
8d90: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
8da0: 69 66 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72  if defined(Inter
8db0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8dc0: 68 61 6e 67 65 29 0a 20 20 7b 20 22 49 6e 74 65  hange).  { "Inte
8dd0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8de0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
8df0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8e00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
8e10: 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63  efine osInterloc
8e20: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8e30: 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  ge InterlockedCo
8e40: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 0a 23 65  mpareExchange.#e
8e50: 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f  lse.  { "Interlo
8e60: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8e70: 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 49  nge", (SYSCALL)I
8e80: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8e90: 65 45 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c 0a  eExchange, 0 },.
8ea0: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8eb0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8ec0: 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49 4e  hange ((LONG(WIN
8ed0: 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a 20 20 20  API*)(LONG \.   
8ee0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
8ef0: 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20 4c 4f 4e  2_VOLATILE*, LON
8f00: 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63 61 6c 6c  G,LONG))aSyscall
8f10: 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [76].pCurrent).#
8f20: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
8f30: 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  (InterlockedComp
8f40: 61 72 65 45 78 63 68 61 6e 67 65 29 20 2a 2f 0a  areExchange) */.
8f50: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
8f60: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
8f70: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
8f80: 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55  ITE_WIN32_USE_UU
8f90: 49 44 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  ID.  { "UuidCrea
8fa0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
8fb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 75 69 64     (SYSCALL)Uuid
8fc0: 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20  Create,         
8fd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8fe0: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 22 2c   { "UuidCreate",
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9000: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
9030: 66 69 6e 65 20 6f 73 55 75 69 64 43 72 65 61 74  fine osUuidCreat
9040: 65 20 28 28 52 50 43 5f 53 54 41 54 55 53 28 52  e ((RPC_STATUS(R
9050: 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a  PC_ENTRY*)(UUID*
9060: 29 29 61 53 79 73 63 61 6c 6c 5b 37 37 5d 2e 70  ))aSyscall[77].p
9070: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
9080: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
9090: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
90a0: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
90b0: 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 20  32_USE_UUID.  { 
90c0: 22 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  "UuidCreateSeque
90d0: 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53  ntial",     (SYS
90e0: 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65 53  CALL)UuidCreateS
90f0: 65 71 75 65 6e 74 69 61 6c 2c 20 20 20 30 20 7d  equential,   0 }
9100: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75 69  ,.#else.  { "Uui
9110: 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61  dCreateSequentia
9120: 6c 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  l",     (SYSCALL
9130: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
9140: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
9150: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
9160: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
9170: 74 69 61 6c 20 5c 0a 20 20 20 20 20 20 20 20 28  tial \.        (
9180: 28 52 50 43 5f 53 54 41 54 55 53 28 52 50 43 5f  (RPC_STATUS(RPC_
9190: 45 4e 54 52 59 2a 29 28 55 55 49 44 2a 29 29 61  ENTRY*)(UUID*))a
91a0: 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70 43 75 72  Syscall[78].pCur
91b0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
91c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
91d0: 4e 43 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41  NC) && SQLITE_MA
91e0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
91f0: 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69  { "FlushViewOfFi
9200: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  le",          (S
9210: 59 53 43 41 4c 4c 29 46 6c 75 73 68 56 69 65 77  YSCALL)FlushView
9220: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 30  OfFile,        0
9230: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
9240: 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c  lushViewOfFile",
9250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
9260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
9270: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
9280: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
9290: 6f 73 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c  osFlushViewOfFil
92a0: 65 20 5c 0a 20 20 20 20 20 20 20 20 28 28 42 4f  e \.        ((BO
92b0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
92c0: 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61 53 79 73  OID,SIZE_T))aSys
92d0: 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72 72 65 6e  call[79].pCurren
92e0: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
92f0: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
9300: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
9310: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
9320: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
9330: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
9340: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
9350: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77  all of the.** "w
9360: 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65  in32" VFSes.  Re
9370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
9380: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
9390: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
93a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
93b0: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
93c0: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
93d0: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
93e0: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
93f0: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
9400: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9410: 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inSetSystemCall(
9420: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
9430: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
9440: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
9450: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
9460: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9470: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
9480: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
9490: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
94a0: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
94b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
94c0: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
94d0: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
94e0: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
94f0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
9500: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
9510: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
9520: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9530: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
9540: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
9550: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
9560: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
9570: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
9580: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
9590: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
95a0: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
95b0: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
95c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
95d0: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
95e0: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
95f0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
9600: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
9610: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
9620: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
9630: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
9640: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
9650: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
9660: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
9670: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
9680: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
9690: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
96a0: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
96b0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
96c0: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
96d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
96e0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
96f0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9700: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9710: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
9720: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
9730: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
9740: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9750: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
9760: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
9770: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
9780: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
9790: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
97a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
97b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
97c0: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
97d0: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
97e0: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
97f0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
9800: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
9810: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
9820: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
9830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9840: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9850: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
9860: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
9870: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
9880: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
9890: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
98a0: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
98b0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
98c0: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
98d0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
98e0: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
98f0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
9900: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
9910: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
9920: 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43  tr winGetSystemC
9930: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
9940: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
9950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9960: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
9970: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
9980: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
9990: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
99a0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
99b0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
99c0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
99d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
99e0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
99f0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
9a00: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
9a10: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
9a20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9a30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
9a40: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
9a50: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
9a60: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
9a70: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
9a80: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
9a90: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
9aa0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
9ab0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
9ac0: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
9ad0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
9ae0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
9af0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
9b00: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
9b10: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
9b20: 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74  st char *winNext
9b30: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
9b40: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
9b50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
9b60: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
9b70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9b80: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
9b90: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
9ba0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
9bb0: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
9bc0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
9bd0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9be0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9c00: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
9c10: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
9c20: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
9c30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
9c40: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
9c50: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
9c60: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
9c70: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
9c80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9c90: 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69  OC./*.** If a Wi
9ca0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
9cb0: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
9cc0: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
9cd0: 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  on will attempt 
9ce0: 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74  to.** compact it
9cf0: 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  .  Upon success,
9d00: 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20   SQLITE_OK will 
9d10: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55 70  be returned.  Up
9d20: 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a  on failure, one.
9d30: 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** of SQLITE_NOM
9d40: 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  EM, SQLITE_ERROR
9d50: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
9d60: 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65 74  OUND will be ret
9d70: 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22  urned.  The.** "
9d80: 70 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75 6d  pnLargest" argum
9d90: 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f  ent, if non-zero
9da0: 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  , will be used t
9db0: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a  o return the siz
9dc0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67  e of the.** larg
9dd0: 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66 72  est committed fr
9de0: 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20  ee block in the 
9df0: 68 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a  heap, in bytes..
9e00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
9e10: 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61  in32_compact_hea
9e20: 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67 65  p(LPUINT pnLarge
9e30: 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
9e40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e  SQLITE_OK;.  UIN
9e50: 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  T nLargest = 0;.
9e60: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
9e70: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
9e80: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
9e90: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
9ea0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
9eb0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
9ec0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
9ed0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9ee0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9ef0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9f00: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9f10: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9f20: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
9f30: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
9f40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9f50: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
9f60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  ;.#endif.#if !SQ
9f70: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
9f80: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
9f90: 54 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73  T.  if( (nLarges
9fa0: 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28  t=osHeapCompact(
9fb0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9fc0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29  N32_HEAP_FLAGS))
9fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  ==0 ){.    DWORD
9fe0: 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
9ff0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
a000: 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
a010: 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  ==NO_ERROR ){.  
a020: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
a030: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
a040: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d  ailed to HeapCom
a050: 70 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c  pact (no space),
a060: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
a080: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
a090: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
a0a0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  MEM_BKPT;.    }e
a0b0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
a0c0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
a0d0: 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ROR, "failed to 
a0e0: 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75  HeapCompact (%lu
a0f0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
a110: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
a120: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
a130: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a140: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
a150: 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74   }.#else.  sqlit
a160: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
a170: 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20  TFOUND, "failed 
a180: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  to HeapCompact, 
a190: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
a1a0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
a1b0: 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51  Heap);.  rc = SQ
a1c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23  LITE_NOTFOUND;.#
a1d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61  endif.  if( pnLa
a1e0: 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65  rgest ) *pnLarge
a1f0: 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20  st = nLargest;. 
a200: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a210: 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20  *.** If a Win32 
a220: 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20  native heap has 
a230: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
a240: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
a250: 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a  ill attempt to.*
a260: 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  * destroy and re
a270: 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74  create it.  If t
a280: 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20  he Win32 native 
a290: 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c  heap is not isol
a2a0: 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74  ated and/or.** t
a2b0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  he sqlite3_memor
a2c0: 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f  y_used() functio
a2d0: 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72  n does not retur
a2e0: 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42  n zero, SQLITE_B
a2f0: 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72  USY will.** be r
a300: 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63  eturned and no c
a310: 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d  hanges will be m
a320: 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ade to the Win32
a330: 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f   native heap..*/
a340: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
a350: 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b  32_reset_heap(){
a360: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54  .  int rc;.  MUT
a370: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
a380: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
a390: 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ; ) /* The main 
a3a0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a  static mutex */.
a3b0: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
a3c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
a3d0: 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20  em; )    /* The 
a3e0: 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75  memsys static mu
a3f0: 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  tex */.  MUTEX_L
a400: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
a410: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a420: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
a430: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
a440: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a450: 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75  pMem = sqlite3Mu
a460: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
a470: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
a480: 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
a490: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
a4a0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  er);.  sqlite3_m
a4b0: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29  utex_enter(pMem)
a4c0: 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ;.  winMemAssert
a4d0: 4d 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77  Magic();.  if( w
a4e0: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
a4f0: 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65  NULL && winMemGe
a500: 74 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69  tOwned() && sqli
a510: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
a520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  )==0 ){.    /*. 
a530: 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
a540: 69 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c  int, there shoul
a550: 64 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  d be no outstand
a560: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
a570: 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a  ations on.    **
a580: 20 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f   the heap.  Also
a590: 2c 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65  , since both the
a5a0: 20 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73   master and mems
a5b0: 79 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72  ys locks are cur
a5c0: 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65  rently.    ** be
a5d0: 69 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20  ing held by us, 
a5e0: 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  no other functio
a5f0: 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f  n (i.e. from ano
a600: 74 68 65 72 20 74 68 72 65 61 64 29 20 73 68 6f  ther thread) sho
a610: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62  uld.    ** be ab
a620: 6c 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73  le to even acces
a630: 73 20 74 68 65 20 68 65 61 70 2e 20 20 41 74 74  s the heap.  Att
a640: 65 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20  empt to destroy 
a650: 61 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75 72  and recreate our
a660: 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64  .    ** isolated
a670: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
a680: 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  ap now..    */. 
a690: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
a6a0: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
a6b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a6c0: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
a6d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a6e0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
a6f0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
a700: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77  winMemShutdown(w
a710: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
a720: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
a730: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d  winMemGetHeap()=
a740: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73  =NULL );.    ass
a750: 65 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f  ert( !winMemGetO
a760: 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73  wned() );.    as
a770: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65  sert( sqlite3_me
a780: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
a790: 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65  ;.    rc = winMe
a7a0: 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44  mInit(winMemGetD
a7b0: 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61  ataPtr());.    a
a7c0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a7d0: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
a7e0: 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b  tHeap()!=NULL );
a7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
a800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69  =SQLITE_OK || wi
a810: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
a820: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
a830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
a840: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a850: 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  ed()==0 );.  }el
a860: 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  se{.    /*.    *
a870: 2a 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69  * The Win32 nati
a880: 76 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62  ve heap cannot b
a890: 65 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75  e modified becau
a8a0: 73 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  se it may be in 
a8b0: 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
a8c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
a8d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
a8e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d  mutex_leave(pMem
a8f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
a900: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
a910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a920: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a930: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
a940: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
a950: 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20  unction outputs 
a960: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41  the specified (A
a970: 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74  NSI) string to t
a980: 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65  he Win32 debugge
a990: 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62  r.** (if availab
a9a0: 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71  le)..*/..void sq
a9b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74  lite3_win32_writ
a9c0: 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68  e_debug(const ch
a9d0: 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42  ar *zBuf, int nB
a9e0: 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67  uf){.  char zDbg
a9f0: 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32  Buf[SQLITE_WIN32
aa00: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a  _DBG_BUF_SIZE];.
aa10: 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
aa20: 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57  (nBuf, (SQLITE_W
aa30: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
aa40: 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20  E - 1)); /* may 
aa50: 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a  be negative. */.
aa60: 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20    if( nMin<-1 ) 
aa70: 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c  nMin = -1; /* al
aa80: 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  l negative value
aa90: 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a  s become -1. */.
aaa0: 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d    assert( nMin==
aab0: 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c  -1 || nMin==0 ||
aac0: 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e   nMin<SQLITE_WIN
aad0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
aae0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
aaf0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
ab00: 52 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b  R.  if( !zBuf ){
ab10: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
ab20: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
ab30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
ab40: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
ab50: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
ab60: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
ab70: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
ab80: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
ab90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
aba0: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
abb0: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
abc0: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
abd0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
abe0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
abf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
ac00: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
ac10: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
ac20: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
ac30: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
ac40: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
ac50: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
ac60: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
ac70: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
ac80: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
ac90: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
aca0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
acb0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
acc0: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
acd0: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
ace0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
acf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
ad00: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
ad10: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
ad20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
ad30: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
ad40: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
ad50: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
ad60: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
ad70: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
ad80: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
ad90: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
ada0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
adb0: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
adc0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
add0: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
ade0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
adf0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
ae00: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
ae10: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
ae20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
ae30: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
ae40: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
ae50: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
ae60: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
ae70: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
ae80: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
ae90: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
aea0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
aeb0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
aec0: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
aed0: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
aee0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
aef0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
af00: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
af10: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
af20: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
af30: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
af40: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
af50: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
af60: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
af70: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
af80: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
afb0: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
afc0: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
afd0: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
afe0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
aff0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
b000: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
b010: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
b020: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
b030: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
b040: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
b050: 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21 53  _THREADS>0 && !S
b060: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
b070: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
b080: 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  RT && \.        
b090: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
b0a0: 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74 65  E>0.DWORD sqlite
b0b0: 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c  3Win32Wait(HANDL
b0c0: 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57  E hObject){.  DW
b0d0: 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28  ORD rc;.  while(
b0e0: 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72   (rc = osWaitFor
b0f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68  SingleObjectEx(h
b100: 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45  Object, INFINITE
b110: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d           TRUE))=
b140: 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54  =WAIT_IO_COMPLET
b150: 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e  ION ){}.  return
b160: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
b170: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b180: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
b190: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
b1a0: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
b1b0: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
b1c0: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
b1d0: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
b1e0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
b1f0: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
b200: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
b210: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
b220: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
b230: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
b240: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
b250: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
b260: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
b270: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
b280: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
b290: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
b2a0: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
b2b0: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
b2c0: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
b2d0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
b2e0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b2f0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
b300: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
b310: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
b320: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
b330: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
b340: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
b350: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
b360: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
b370: 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  .*/..#if !SQLITE
b380: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
b390: 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  NEX.# define osI
b3a0: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
b3b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
b3c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
b3d0: 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NRT || !defined(
b3e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b3f0: 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20  _ANSI).# define 
b400: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65  osIsNT()  (1).#e
b410: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  lif !defined(SQL
b420: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
b430: 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  DE).# define osI
b440: 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65  sNT()  (0).#else
b450: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
b460: 28 29 20 20 28 28 73 71 6c 69 74 65 33 5f 6f 73  ()  ((sqlite3_os
b470: 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71 6c  _type==2) || sql
b480: 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74  ite3_win32_is_nt
b490: 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ()).#endif../*.*
b4a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b4b0: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 74 68  determines if th
b4c0: 65 20 6d 61 63 68 69 6e 65 20 69 73 20 72 75 6e  e machine is run
b4d0: 6e 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20 6f  ning a version o
b4e0: 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61 73  f Windows.** bas
b4f0: 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72  ed on the NT ker
b500: 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nel..*/.int sqli
b510: 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28  te3_win32_is_nt(
b520: 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54  void){.#if SQLIT
b530: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 2f 2a 0a  E_OS_WINRT.  /*.
b540: 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68 65 20 57    ** NOTE: The W
b550: 69 6e 52 54 20 73 75 62 2d 70 6c 61 74 66 6f 72  inRT sub-platfor
b560: 6d 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 75  m is always assu
b570: 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20  med to be based 
b580: 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a 2a 20 20  on the NT.  **  
b590: 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a       kernel..  *
b5a0: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  /.  return 1;.#e
b5b0: 6c 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  lif SQLITE_WIN32
b5c0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
b5d0: 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  if( osInterlocke
b5e0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
b5f0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
b600: 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23  e, 0, 0)==0 ){.#
b610: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b620: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
b630: 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49  ).    OSVERSIONI
b640: 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOA sInfo;.    
b650: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
b660: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
b670: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  of(sInfo);.    o
b680: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26  sGetVersionExA(&
b690: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e  sInfo);.    osIn
b6a0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
b6b0: 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65  Exchange(&sqlite
b6c0: 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20  3_os_type,.     
b6d0: 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74     (sInfo.dwPlat
b6e0: 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c  formId == VER_PL
b6f0: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29  ATFORM_WIN32_NT)
b700: 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65   ? 2 : 1, 0);.#e
b710: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
b720: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
b730: 45 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  E).    OSVERSION
b740: 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOW sInfo;.   
b750: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
b760: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
b770: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
b780: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 28  osGetVersionExW(
b790: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49  &sInfo);.    osI
b7a0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
b7b0: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
b7c0: 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20  e3_os_type,.    
b7d0: 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61      (sInfo.dwPla
b7e0: 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50  tformId == VER_P
b7f0: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
b800: 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23  ) ? 2 : 1, 0);.#
b810: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
b820: 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64  rn osInterlocked
b830: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28  CompareExchange(
b840: 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
b850: 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69  , 2, 2)==2;.#eli
b860: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
b870: 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f  return osInterlo
b880: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
b890: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
b8a0: 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a  type, 2, 2)==2;.
b8b0: 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
b8c0: 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c  NOTE: All sub-pl
b8d0: 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20 74 68  atforms where th
b8e0: 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41  e GetVersionEx[A
b8f0: 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  W] functions are
b900: 0a 20 20 2a 2a 20 20 20 20 20 20 20 64 65 70 72  .  **       depr
b910: 65 63 61 74 65 64 20 61 72 65 20 61 6c 77 61 79  ecated are alway
b920: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
b930: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20  based on the NT 
b940: 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72  kernel..  */.  r
b950: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
b960: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
b970: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
b980: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
b990: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a  tes of memory..*
b9a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
b9b0: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
b9c0: 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c  nBytes){.  HANDL
b9d0: 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20  E hHeap;.  void 
b9e0: 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  *p;..  winMemAss
b9f0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
ba00: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
ba10: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
ba20: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
ba30: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
ba40: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
ba50: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
ba60: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
ba70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
ba80: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
ba90: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
baa0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
bab0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bac0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
bad0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  L) );.#endif.  a
bae0: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
baf0: 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70   );.  p = osHeap
bb00: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
bb10: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bb20: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
bb30: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20  ytes);.  if( !p 
bb40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
bb50: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
bb60: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
bb70: 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28  Alloc %u bytes (
bb80: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
bbb0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
bbc0: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
bbd0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
bbe0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a  * Free memory..*
bbf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
bc00: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
bc10: 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45  Prior){.  HANDLE
bc20: 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65   hHeap;..  winMe
bc30: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
bc40: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
bc50: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
bc60: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
bc70: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bc80: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
bc90: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
bca0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
bcb0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
bcc0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
bcd0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
bce0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
bcf0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
bd00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bd10: 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64   pPrior) );.#end
bd20: 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  if.  if( !pPrior
bd30: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61   ) return; /* Pa
bd40: 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65  ssing NULL to He
bd50: 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69  apFree is undefi
bd60: 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f  ned. */.  if( !o
bd70: 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c  sHeapFree(hHeap,
bd80: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bd90: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
bda0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
bdb0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
bdc0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
bdd0: 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20  apFree block %p 
bde0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
bdf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be00: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
be10: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
be20: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
be30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
be40: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
be50: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
be60: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
be70: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
be80: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
be90: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
bea0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
beb0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
bec0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
bed0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
bee0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
bef0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
bf00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
bf10: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
bf20: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
bf30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
bf40: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
bf50: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
bf60: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
bf70: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
bf80: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
bf90: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
bfa0: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
bfb0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
bfc0: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
bfd0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20  if( !pPrior ){. 
bfe0: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c     p = osHeapAll
bff0: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
c000: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c010: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
c020: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
c030: 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c   p = osHeapReAll
c040: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
c050: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c060: 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45  S, pPrior, (SIZE
c070: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a  _T)nBytes);.  }.
c080: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
c090: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c0a0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
c0b0: 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73  d to %s %u bytes
c0c0: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
c0d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c0e0: 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70    pPrior ? "Heap
c0f0: 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70  ReAlloc" : "Heap
c100: 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20  Alloc", nBytes, 
c110: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
c120: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c130: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
c140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
c150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c160: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
c170: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
c180: 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73  cation, in bytes
c190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c1a0: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
c1b0: 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  *p){.  HANDLE hH
c1c0: 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b  eap;.  SIZE_T n;
c1d0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
c1e0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
c1f0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
c200: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
c210: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
c220: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
c230: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
c240: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
c250: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
c260: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
c270: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
c280: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
c290: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
c2a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
c2b0: 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a  AP_FLAGS, p) );.
c2c0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
c2d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
c2e0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
c2f0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c300: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
c310: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
c320: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
c330: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
c340: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
c350: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
c360: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
c370: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
c380: 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74      p, osGetLast
c390: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
c3a0: 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75  hHeap);.    retu
c3b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
c3c0: 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a  rn (int)n;.}../*
c3d0: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72  .** Round up a r
c3e0: 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74  equest size to t
c3f0: 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c  he next valid al
c400: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a  location size..*
c410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
c420: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
c430: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  ){.  return n;.}
c440: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
c450: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
c460: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
c470: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
c480: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
c490: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
c4a0: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
c4b0: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
c4c0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
c4d0: 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
c4e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72  E_ERROR;.  asser
c4f0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c500: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
c510: 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72  AGIC1 );.  asser
c520: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c530: 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic2==WINMEM_M
c540: 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21 53  AGIC2 );..#if !S
c550: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
c560: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  & SQLITE_WIN32_H
c570: 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28  EAP_CREATE.  if(
c580: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
c590: 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f 52  Heap ){.    DWOR
c5a0: 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20  D dwInitialSize 
c5b0: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  = SQLITE_WIN32_H
c5c0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20  EAP_INIT_SIZE;. 
c5d0: 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69 6d     DWORD dwMaxim
c5e0: 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44 29  umSize = (DWORD)
c5f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
c600: 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69  fig.nHeap;.    i
c610: 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  f( dwMaximumSize
c620: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77 4d  ==0 ){.      dwM
c630: 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c  aximumSize = SQL
c640: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
c650: 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c  AX_SIZE;.    }el
c660: 73 65 20 69 66 28 20 64 77 49 6e 69 74 69 61 6c  se if( dwInitial
c670: 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69  Size>dwMaximumSi
c680: 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49 6e  ze ){.      dwIn
c690: 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61  itialSize = dwMa
c6a0: 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d  ximumSize;.    }
c6b0: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
c6c0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70  ->hHeap = osHeap
c6d0: 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49  Create(SQLITE_WI
c6e0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53        dwInitialS
c720: 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69  ize, dwMaximumSi
c730: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57  ze);.    if( !pW
c740: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c760: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c770: 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66  EM,.          "f
c780: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65  ailed to HeapCre
c790: 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67 73  ate (%lu), flags
c7a0: 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c  =%u, initSize=%l
c7b0: 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c  u, maxSize=%lu",
c7c0: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
c7d0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
c7e0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
c7f0: 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c 53  LAGS, dwInitialS
c800: 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 64  ize,.          d
c810: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20  wMaximumSize);. 
c820: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c830: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
c840: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
c850: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
c860: 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28  RUE;.    assert(
c870: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
c880: 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  wned );.  }.#els
c890: 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  e.  pWinMemData-
c8a0: 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72  >hHeap = osGetPr
c8b0: 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69  ocessHeap();.  i
c8c0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
c8d0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71  >hHeap ){.    sq
c8e0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c8f0: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
c900: 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72  "failed to GetPr
c910: 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22  ocessHeap (%lu)"
c920: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c930: 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
c940: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
c950: 54 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d  T;.  }.  pWinMem
c960: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
c970: 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  ALSE;.  assert( 
c980: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f  !pWinMemData->bO
c990: 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  wned );.#endif. 
c9a0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
c9b0: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
c9c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
c9d0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c9e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
c9f0: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
ca00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
ca10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
ca20: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
ca30: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
ca40: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
ca50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
ca60: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
ca70: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
ca80: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ) );.#endif.  re
ca90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
caa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
cab0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
cac0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cad0: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
cae0: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
caf0: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
cb00: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
cb10: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
cb20: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
cb30: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
cb40: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  rn;.  assert( pW
cb50: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
cb60: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
cb70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
cb80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
cb90: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
cba0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d   );..  if( pWinM
cbb0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
cbc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
cbd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
cbe0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
cbf0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
cc00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
cc10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
cc20: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
cc30: 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65 72  IDATE).    asser
cc40: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
cc50: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
cc60: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
cc70: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
cc80: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
cc90: 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61     if( pWinMemDa
cca0: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20  ta->bOwned ){.  
ccb0: 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70 44      if( !osHeapD
ccc0: 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61  estroy(pWinMemDa
ccd0: 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20  ta->hHeap) ){.  
cce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
ccf0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
cd00: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44  "failed to HeapD
cd10: 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68 65  estroy (%lu), he
cd20: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
cd40: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
cd50: 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61  oid*)pWinMemData
cd60: 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  ->hHeap);.      
cd70: 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44  }.      pWinMemD
cd80: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
cd90: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  LSE;.    }.    p
cda0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cdb0: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  p = NULL;.  }.}.
cdc0: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
cdd0: 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65  the low-level me
cde0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
cdf0: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
ce00: 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47  s in.** sqlite3G
ce10: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69  lobalConfig.m wi
ce20: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  th pointers to t
ce30: 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  he routines in t
ce40: 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a  his file. The.**
ce50: 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69   arguments speci
ce60: 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  fy the block of 
ce70: 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65  memory to manage
ce80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ce90: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
cea0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  led by sqlite3_c
ceb0: 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65  onfig(), and the
cec0: 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74  refore.** is not
ced0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
cee0: 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69  threadsafe (it i
cef0: 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74  s not)..*/.const
cf00: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
cf10: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d  hods *sqlite3Mem
cf20: 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a  GetWin32(void){.
cf30: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
cf40: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
cf50: 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  ds winMemMethods
cf60: 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d   = {.    winMemM
cf70: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
cf80: 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mFree,.    winMe
cf90: 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  mRealloc,.    wi
cfa0: 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69  nMemSize,.    wi
cfb0: 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20  nMemRoundup,.   
cfc0: 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20   winMemInit,.   
cfd0: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c   winMemShutdown,
cfe0: 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61  .    &win_mem_da
cff0: 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e  ta.  };.  return
d000: 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b   &winMemMethods;
d010: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
d020: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f  MemSetDefault(vo
d030: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  id){.  sqlite3_c
d040: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
d050: 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69  FIG_MALLOC, sqli
d060: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29  te3MemGetWin32()
d070: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
d080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
d090: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OC */../*.** Con
d0a0: 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72  vert a UTF-8 str
d0b0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
d0c0: 20 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20   Unicode..**.** 
d0d0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d0e0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
d0f0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
d100: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d110: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  c()..*/.static L
d120: 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55  PWSTR winUtf8ToU
d130: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
d140: 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 69 6e 74  r *zText){.  int
d150: 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52   nChar;.  LPWSTR
d160: 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a 20 20 6e   zWideText;..  n
d170: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
d180: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
d190: 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20  UTF8, 0, zText, 
d1a0: 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  -1, NULL, 0);.  
d1b0: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
d1c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d1d0: 7d 0a 20 20 7a 57 69 64 65 54 65 78 74 20 3d 20  }.  zWideText = 
d1e0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
d1f0: 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  o( nChar*sizeof(
d200: 57 43 48 41 52 29 20 29 3b 0a 20 20 69 66 28 20  WCHAR) );.  if( 
d210: 7a 57 69 64 65 54 65 78 74 3d 3d 30 20 29 7b 0a  zWideText==0 ){.
d220: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d230: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  }.  nChar = osMu
d240: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
d250: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 54  r(CP_UTF8, 0, zT
d260: 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64 65 54 65  ext, -1, zWideTe
d270: 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt,.            
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
d2a0: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
d2b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d2c0: 57 69 64 65 54 65 78 74 29 3b 0a 20 20 20 20 7a  WideText);.    z
d2d0: 57 69 64 65 54 65 78 74 20 3d 20 30 3b 0a 20 20  WideText = 0;.  
d2e0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
d2f0: 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Text;.}../*.** C
d300: 6f 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73 6f  onvert a Microso
d310: 66 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e  ft Unicode strin
d320: 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a  g to UTF-8..**.*
d330: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
d340: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d350: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d360: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d370: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
d380: 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64   char *winUnicod
d390: 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20  eToUtf8(LPCWSTR 
d3a0: 7a 57 69 64 65 54 65 78 74 29 7b 0a 20 20 69 6e  zWideText){.  in
d3b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
d3c0: 2a 7a 54 65 78 74 3b 0a 0a 20 20 6e 42 79 74 65  *zText;..  nByte
d3d0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
d3e0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
d3f0: 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20  , 0, zWideText, 
d400: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
d410: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
d420: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d430: 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d  0;.  }.  zText =
d440: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
d450: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
d460: 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
d470: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d480: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
d490: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
d4a0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
d4b0: 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78  deText, -1, zTex
d4c0: 74 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  t, nByte,.      
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b            0, 0);
d4f0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
d500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d510: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
d520: 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d    zText = 0;.  }
d530: 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b  .  return zText;
d540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
d550: 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67  t an ANSI string
d560: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
d570: 69 63 6f 64 65 2c 20 75 73 69 6e 67 20 74 68 65  icode, using the
d580: 20 41 4e 53 49 20 6f 72 20 4f 45 4d 0a 2a 2a 20   ANSI or OEM.** 
d590: 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  code page..**.**
d5a0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d5b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d5c0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d5d0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d5e0: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
d5f0: 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f  LPWSTR winMbcsTo
d600: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
d610: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
d620: 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20 6e  seAnsi){.  int n
d630: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
d640: 4d 62 63 73 54 65 78 74 3b 0a 20 20 69 6e 74 20  MbcsText;.  int 
d650: 63 6f 64 65 70 61 67 65 20 3d 20 75 73 65 41 6e  codepage = useAn
d660: 73 69 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  si ? CP_ACP : CP
d670: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
d680: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
d690: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
d6a0: 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  e, 0, zText, -1,
d6b0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66         0)*sizeof
d6e0: 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e  (WCHAR);.  if( n
d6f0: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Byte==0 ){.    r
d700: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
d710: 4d 62 63 73 54 65 78 74 20 3d 20 73 71 6c 69 74  MbcsText = sqlit
d720: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
d730: 79 74 65 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  yte*sizeof(WCHAR
d740: 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73  ) );.  if( zMbcs
d750: 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Text==0 ){.    r
d760: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d770: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
d780: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
d790: 65 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c  epage, 0, zText,
d7a0: 20 2d 31 2c 20 7a 4d 62 63 73 54 65 78 74 2c 0a   -1, zMbcsText,.
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
d7e0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
d7f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
d800: 54 65 78 74 29 3b 0a 20 20 20 20 7a 4d 62 63 73  Text);.    zMbcs
d810: 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Text = 0;.  }.  
d820: 72 65 74 75 72 6e 20 7a 4d 62 63 73 54 65 78 74  return zMbcsText
d830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d840: 72 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55  rt a Microsoft U
d850: 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f  nicode string to
d860: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68   a multi-byte ch
d870: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 0a  aracter string,.
d880: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53  ** using the ANS
d890: 49 20 6f 72 20 4f 45 4d 20 63 6f 64 65 20 70 61  I or OEM code pa
d8a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ge..**.** Space 
d8b0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
d8c0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d8d0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d8e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d8f0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
d900: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
d910: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54 65 78  LPCWSTR zWideTex
d920: 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b  t, int useAnsi){
d930: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
d940: 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20 69  char *zText;.  i
d950: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73  nt codepage = us
d960: 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a  eAnsi ? CP_ACP :
d970: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d980: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d990: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
d9a0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54 65  page, 0, zWideTe
d9b0: 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  xt, -1, 0, 0, 0,
d9c0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
d9d0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
d9e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65  urn 0;.  }.  zTe
d9f0: 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  xt = sqlite3Mall
da00: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
da10: 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20  .  if( zText==0 
da20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
da30: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
da40: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
da50: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
da60: 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c  , zWideText, -1,
da70: 20 7a 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20   zText,.        
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
daa0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
dab0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
dac0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
dad0: 29 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d 20 30  );.    zText = 0
dae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
daf0: 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Text;.}../*.** C
db00: 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74 69 2d 62  onvert a multi-b
db10: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
db20: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a  ring to UTF-8..*
db30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
db40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
db50: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
db60: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
db70: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
db80: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 4d 62 63  tic char *winMbc
db90: 73 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 63 68  sToUtf8(const ch
dba0: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
dbb0: 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72 20  seAnsi){.  char 
dbc0: 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20 20 4c 50  *zTextUtf8;.  LP
dbd0: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
dbe0: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
dbf0: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 54  MbcsToUnicode(zT
dc00: 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 20  ext, useAnsi);. 
dc10: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
dc20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
dc30: 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 55 74 66  ;.  }.  zTextUtf
dc40: 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  8 = winUnicodeTo
dc50: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
dc60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
dc70: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
dc80: 72 6e 20 7a 54 65 78 74 55 74 66 38 3b 0a 7d 0a  rn zTextUtf8;.}.
dc90: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
dca0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
dcb0: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68   a multi-byte ch
dcc0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 0a  aracter string..
dcd0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
dce0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
dcf0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
dd00: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
dd10: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
dd20: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 74  atic char *winUt
dd30: 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 63  f8ToMbcs(const c
dd40: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
dd50: 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72  useAnsi){.  char
dd60: 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a 20 20 4c   *zTextMbcs;.  L
dd70: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
dd80: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69  .  zTmpWide = wi
dd90: 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
dda0: 54 65 78 74 29 3b 0a 20 20 69 66 28 20 7a 54 6d  Text);.  if( zTm
ddb0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
ddc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ddd0: 7a 54 65 78 74 4d 62 63 73 20 3d 20 77 69 6e 55  zTextMbcs = winU
dde0: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d  nicodeToMbcs(zTm
ddf0: 70 57 69 64 65 2c 20 75 73 65 41 6e 73 69 29 3b  pWide, useAnsi);
de00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
de10: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
de20: 75 72 6e 20 7a 54 65 78 74 4d 62 63 73 3b 0a 7d  urn zTextMbcs;.}
de30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
de40: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72  a public wrapper
de50: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66 38   for the winUtf8
de60: 54 6f 55 6e 69 63 6f 64 65 28 29 20 66 75 6e 63  ToUnicode() func
de70: 74 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53 54 52 20  tion..*/.LPWSTR 
de80: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
de90: 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f  f8_to_unicode(co
dea0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29  nst char *zText)
deb0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
dec0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
ded0: 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b  .  if( !zText ){
dee0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
def0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
df00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
df10: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
df20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
df30: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
df40: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
df50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
df60: 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55  if.  return winU
df70: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65  tf8ToUnicode(zTe
df80: 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
df90: 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77  is is a public w
dfa0: 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77  rapper for the w
dfb0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
dfc0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  ) function..*/.c
dfd0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
dfe0: 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74  32_unicode_to_ut
dff0: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
e000: 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51  Text){.#ifdef SQ
e010: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e020: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 57 69  ARMOR.  if( !zWi
e030: 64 65 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76  deText ){.    (v
e040: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
e050: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
e060: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
e070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e080: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
e090: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  if( sqlite3_init
e0a0: 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72  ialize() ) retur
e0b0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  n 0;.#endif.  re
e0c0: 74 75 72 6e 20 77 69 6e 55 6e 69 63 6f 64 65 54  turn winUnicodeT
e0d0: 6f 55 74 66 38 28 7a 57 69 64 65 54 65 78 74 29  oUtf8(zWideText)
e0e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e0f0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
e100: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 4d  per for the winM
e110: 62 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e 63  bcsToUtf8() func
e120: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e130: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
e140: 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20  s_to_utf8(const 
e150: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69  char *zText){.#i
e160: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e170: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e180: 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20  f( !zText ){.   
e190: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
e1a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
e1b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
e1c0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e1d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
e1e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
e1f0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
e200: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
e210: 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73 54   return winMbcsT
e220: 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 6f 73 41  oUtf8(zText, osA
e230: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
e240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e250: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
e260: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
e270: 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e  MbcsToUtf8() fun
e280: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e290: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
e2a0: 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f  cs_to_utf8_v2(co
e2b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
e2c0: 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 23   int useAnsi){.#
e2d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e2e0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e2f0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
e300: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e310: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e320: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
e330: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e340: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e350: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
e360: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
e370: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e380: 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73    return winMbcs
e390: 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 75 73  ToUtf8(zText, us
e3a0: 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eAnsi);.}../*.**
e3b0: 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c 69   This is a publi
e3c0: 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 68  c wrapper for th
e3d0: 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  e winUtf8ToMbcs(
e3e0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  ) function..*/.c
e3f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
e400: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
e410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
e420: 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t){.#ifdef SQLIT
e430: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e440: 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20  OR.  if( !zText 
e450: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
e460: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e470: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
e480: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
e490: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e4a0: 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c  TOINIT.  if( sql
e4b0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
e4c0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
e4d0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69  ndif.  return wi
e4e0: 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65 78  nUtf8ToMbcs(zTex
e4f0: 74 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  t, osAreFileApis
e500: 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ANSI());.}../*.*
e510: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
e520: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
e530: 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73  he winUtf8ToMbcs
e540: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
e550: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
e560: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
e570: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
e580: 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e  zText, int useAn
e590: 73 69 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  si){.#ifdef SQLI
e5a0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e5b0: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
e5c0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e5d0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e5e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e5f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e600: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e610: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e620: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e630: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e640: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e650: 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65  inUtf8ToMbcs(zTe
e660: 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 7d 0a  xt, useAnsi);.}.
e670: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e680: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61  tion sets the da
e690: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
e6a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
e6b0: 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e  rectory based on
e6c0: 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64  .** the provided
e6d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
e6e0: 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d   type argument m
e6f0: 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65  ust be 1 in orde
e700: 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20  r to set the.** 
e710: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
e720: 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  r 2 in order to 
e730: 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72  set the temporar
e740: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68  y directory.  Th
e750: 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75  e zValue.** argu
e760: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
e770: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
e780: 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72  y to use.  The r
e790: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c  eturn value will
e7a0: 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   be.** SQLITE_OK
e7b0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
e7c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
e7d0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
e7e0: 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c  ry(DWORD type, L
e7f0: 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a  PCWSTR zValue){.
e800: 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63    char **ppDirec
e810: 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  tory = 0;.#ifnde
e820: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e830: 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20  TOINIT.  int rc 
e840: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
e850: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
e860: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
e870: 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d  ndif.  if( type=
e880: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
e890: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
e8a0: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
e8b0: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
e8c0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a  data_directory;.
e8d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65    }else if( type
e8e0: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
e8f0: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
e900: 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65  PE ){.    ppDire
e910: 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33  ctory = &sqlite3
e920: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
e930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
e940: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74  ppDirectory || t
e950: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
e960: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
e970: 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20  _TYPE.          
e980: 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  || type==SQLITE_
e990: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
e9a0: 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20  TORY_TYPE.  );. 
e9b0: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
e9c0: 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33  ctory || sqlite3
e9d0: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
e9e0: 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45  *ppDirectory, ME
e9f0: 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20  MTYPE_HEAP) );. 
ea00: 20 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79   if( ppDirectory
ea10: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56   ){.    char *zV
ea20: 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20  alueUtf8 = 0;.  
ea30: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20    if( zValue && 
ea40: 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20  zValue[0] ){.   
ea50: 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20     zValueUtf8 = 
ea60: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
ea70: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
ea80: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
ea90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  M_BKPT;.      }.
eac0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ead0: 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63 74  3_free(*ppDirect
eae0: 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72  ory);.    *ppDir
eaf0: 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55  ectory = zValueU
eb00: 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tf8;.    return 
eb10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
eb20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
eb30: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
eb40: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
eb50: 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  of winGetLastErr
eb60: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
eb70: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
eb80: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
eb90: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
eba0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
ebb0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
ebc0: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
ebd0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
ebe0: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
ebf0: 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72  Msg(DWORD lastEr
ec00: 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  rno, int nBuf, c
ec10: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
ec20: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72   FormatMessage r
ec30: 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c  eturns 0 on fail
ec40: 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ure.  Otherwise 
ec50: 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  it.  ** returns 
ec60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43  the number of TC
ec70: 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20  HARs written to 
ec80: 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20  the output.  ** 
ec90: 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e  buffer, excludin
eca0: 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e  g the terminatin
ecb0: 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a  g null char..  *
ecc0: 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20  /.  DWORD dwLen 
ecd0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  = 0;.  char *zOu
ece0: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73  t = 0;..  if( os
ecf0: 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
ed00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
ed10: 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64    WCHAR zTempWid
ed20: 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e[SQLITE_WIN32_M
ed30: 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b  AX_ERRMSG_CHARS+
ed40: 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  1];.    dwLen = 
ed50: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
ed60: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
ed70: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
eda0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
edb0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
ee00: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20    zTempWide,.   
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ee70: 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53  _WIN32_MAX_ERRMS
ee80: 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20  G_CHARS,.       
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a        0);.#else.
eeb0: 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
eec0: 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
eed0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
eee0: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
eef0: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
ef00: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
ef30: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
ef40: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
ef70: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
ef80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
efa0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52           (LPWSTR
f010: 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20  ) &zTempWide,.  
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
f060: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77  endif.    if( dw
f070: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
f080: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
f090: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
f0a0: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
f0b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
f0c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
f0d0: 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55       zOut = winU
f0e0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
f0f0: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73  mpWide);.      s
f100: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
f110: 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51  alloc();.#if !SQ
f120: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
f130: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
f140: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
f150: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
f160: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
f170: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
f180: 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66  empWide);.#endif
f190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
f1a0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
f1b0: 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
f1c0: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20      char *zTemp 
f1d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
f1e0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
f1f0: 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageA(FORMAT_MESS
f200: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
f210: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
f240: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
f270: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
f280: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
f2d0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65      (LPSTR) &zTe
f320: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
f370: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
f380: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
f390: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
f3a0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
f3b0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
f3c0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
f3d0: 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62      zOut = winMb
f3e0: 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20  csToUtf8(zTemp, 
f3f0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
f400: 49 28 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  I());.      sqli
f410: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
f420: 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  oc();.      /* f
f430: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
f440: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
f450: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
f460: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
f470: 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  lFree(zTemp);.  
f480: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
f490: 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20   if( 0 == dwLen 
f4a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
f4b0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
f4c0: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
f4d0: 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45  lx (%lu)", lastE
f4e0: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
f4f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
f500: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
f510: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
f520: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
f530: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
f540: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
f550: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
f560: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
f570: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
f580: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f590: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
f5a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
f5b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f5c0: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
f5d0: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
f5e0: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
f5f0: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
f600: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
f610: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f620: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
f630: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
f640: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
f650: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
f660: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
f670: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
f680: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
f690: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
f6a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
f6b0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
f6c0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
f6d0: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
f6e0: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
f6f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
f700: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
f710: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
f720: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
f730: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
f740: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
f750: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
f760: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
f770: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
f780: 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65 20  NTOPEN)..** The 
f790: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
f7a0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
f7b0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
f7c0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
f7d0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
f7e0: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
f7f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
f800: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
f810: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
f820: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
f830: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
f840: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
f850: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
f860: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
f870: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
f8a0: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
f8b0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
f8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
f8d0: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
f8e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
f8f0: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
f900: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
f910: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
f920: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
f930: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
f950: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
f960: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
f970: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
f9a0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
f9b0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
f9c0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
f9d0: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
f9e0: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
f9f0: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
fa00: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
fa30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
fa40: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69  Msg[0] = 0;.  wi
fa50: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
fa60: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
fa70: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
fa80: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
fa90: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
faa0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
fab0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
fac0: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
fad0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
fae0: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
faf0: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
fb00: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
fb10: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
fb20: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
fb30: 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73  :%d: (%lu) %s(%s
fb40: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
fb50: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
fb60: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
fb70: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
fb80: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
fb90: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
fba0: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
fbb0: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
fbc0: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
fbd0: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
fbe0: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
fbf0: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
fc00: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
fc10: 79 20 63 61 75 73 65 64 20 62 79 0a 2a 2a 20 61  y caused by.** a
fc20: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
fc30: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
fc40: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
fc50: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
fc60: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
fc70: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
fc80: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
fc90: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
fca0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
fcb0: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
fcc0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
fcd0: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
fce0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
fcf0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
fd00: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
fd10: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
fd20: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
fd30: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
fd40: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
fd50: 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57  Retry = SQLITE_W
fd60: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
fd70: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
fd80: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
fd90: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
fda0: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
fdb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69  ;../*.** The "wi
fdc0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
fdd0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
fde0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
fdf0: 20 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a   particular I/O.
fe00: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62  ** error code ob
fe10: 74 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61  tained via GetLa
fe20: 73 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69  stError() is eli
fe30: 67 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72  gible to be retr
fe40: 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74  ied.  It.** must
fe50: 20 61 63 63 65 70 74 20 74 68 65 20 65 72 72 6f   accept the erro
fe60: 72 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20  r code DWORD as 
fe70: 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  its only argumen
fe80: 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74  t and should ret
fe90: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  urn.** non-zero 
fea0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
feb0: 65 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69  e is transient i
fec0: 6e 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65  n nature and the
fed0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65   operation.** re
fee0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65  sponsible for ge
fef0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69  nerating the ori
ff00: 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68  ginal error migh
ff10: 74 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62  t succeed upon b
ff20: 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e  eing.** retried.
ff30: 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74    The argument t
ff40: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f  o this macro sho
ff50: 75 6c 64 20 62 65 20 61 20 76 61 72 69 61 62 6c  uld be a variabl
ff60: 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f  e..**.** Additio
ff70: 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e  nally, a macro n
ff80: 61 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61  amed "winIoerrCa
ff90: 6e 52 65 74 72 79 32 22 20 6d 61 79 20 62 65 20  nRetry2" may be 
ffa0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a  defined.  If it.
ffb0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69  ** is defined, i
ffc0: 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c  t will be consul
ffd0: 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ted only when th
ffe0: 65 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72  e macro "winIoer
fff0: 72 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72  rCanRetry1".** r
10000 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68  eturns zero.  Th
10010 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
10020 74 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63  try2" macro is c
10030 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e  ompletely option
10040 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65  al and.** may be
10050 20 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   used to include
10060 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f   additional erro
10070 72 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73  r codes in the s
10080 65 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  et that should.*
10090 2a 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  * result in the 
100a0 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72  failing I/O oper
100b0 61 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72  ation being retr
100c0 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
100d0 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65  r.  If.** define
100e0 64 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72  d, the "winIoerr
100f0 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
10100 20 6d 75 73 74 20 65 78 68 69 62 69 74 20 65 78   must exhibit ex
10110 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73  ternal semantics
10120 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f  .** identical to
10130 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77   those of the "w
10140 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
10150 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20  " macro..*/.#if 
10160 21 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72  !defined(winIoer
10170 72 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66  rCanRetry1).#def
10180 69 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52  ine winIoerrCanR
10190 65 74 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d  etry1(a) (((a)==
101a0 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
101b0 49 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c  IED)        || \
101c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
101e0 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49  (a)==ERROR_SHARI
101f0 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20  NG_VIOLATION)   
10200 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
10230 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20  LOCK_VIOLATION) 
10240 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
10270 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49  RROR_DEV_NOT_EXI
10280 53 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ST)        || \.
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
102b0 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d  a)==ERROR_NETNAM
102c0 45 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20 20  E_DELETED)      
102d0 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
10300 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20  EM_TIMEOUT)     
10310 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
10340 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45  ROR_NETWORK_UNRE
10350 41 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66  ACHABLE)).#endif
10360 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
10370 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
10380 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
10390 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
103a0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
103b0 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
103c0 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
103d0 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
103e0 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
103f0 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
10400 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
10410 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
10420 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70  etryIoerr(int *p
10430 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70  nRetry, DWORD *p
10440 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20  Error){.  DWORD 
10450 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  e = osGetLastErr
10460 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52  or();.  if( *pnR
10470 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65  etry>=winIoerrRe
10480 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
10490 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
104a0 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
104b0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
104c0 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65    }.  if( winIoe
104d0 72 72 43 61 6e 52 65 74 72 79 31 28 65 29 20 29  rrCanRetry1(e) )
104e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69  {.    sqlite3_wi
104f0 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65  n32_sleep(winIoe
10500 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
10510 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
10520 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
10530 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69  return 1;.  }.#i
10540 66 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65  f defined(winIoe
10550 72 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65  rrCanRetry2).  e
10560 6c 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72  lse if( winIoerr
10570 43 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a  CanRetry2(e) ){.
10580 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
10590 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72  2_sleep(winIoerr
105a0 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
105b0 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
105c0 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
105d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
105e0 69 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20  if.  if( pError 
105f0 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  ){.    *pError =
10600 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   e;.  }.  return
10610 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67   0;.}../*.** Log
10620 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74   a I/O error ret
10630 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73  ry episode..*/.s
10640 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f  tatic void winLo
10650 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
10660 79 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  y, int lineno){.
10670 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
10680 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
10690 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 2c 0a 20  SQLITE_NOTICE,. 
106a0 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
106b0 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
106c0 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 61 74 20  ing conflict at 
106d0 6c 69 6e 65 20 25 64 22 2c 0a 20 20 20 20 20 20  line %d",.      
106e0 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
106f0 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72  ay*nRetry*(nRetr
10700 79 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e 6f 0a 20  y+1)/2, lineno. 
10710 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a     );.  }.}../*.
10720 2a 2a 20 54 68 69 73 20 23 69 66 20 64 6f 65 73  ** This #if does
10730 20 6e 6f 74 20 72 65 6c 79 20 6f 6e 20 74 68 65   not rely on the
10740 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10750 20 64 65 66 69 6e 65 20 62 65 63 61 75 73 65 20   define because 
10760 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
10770 64 69 6e 67 20 73 65 63 74 69 6f 6e 20 69 6e 20  ding section in 
10780 22 64 61 74 65 2e 63 22 20 63 61 6e 6e 6f 74 20  "date.c" cannot 
10790 75 73 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 20 21  use it..*/.#if !
107a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
107b0 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 29 20 26  MIT_LOCALTIME) &
107c0 26 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  & defined(_WIN32
107d0 5f 57 43 45 29 20 26 26 20 5c 0a 20 20 20 20 28  _WCE) && \.    (
107e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
107f0 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41  MSVC_LOCALTIME_A
10800 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d  PI) || !SQLITE_M
10810 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
10820 49 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56  I)./*.** The MSV
10830 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73  C CRT on Windows
10840 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   CE may not have
10850 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66   a localtime() f
10860 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 20 64  unction..** So d
10870 65 66 69 6e 65 20 61 20 73 75 62 73 74 69 74 75  efine a substitu
10880 74 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63 6c 75 64  te..*/.#  includ
10890 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
108a0 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
108b0 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
108c0 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
108d0 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
108e0 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
108f0 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
10900 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
10910 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
10920 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
10930 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
10940 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
10950 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
10960 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
10970 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
10980 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
10990 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
109a0 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69  4 >> 32);.  osFi
109b0 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
109c0 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29  eTime(&uTm,&lTm)
109d0 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
109e0 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c  SystemTime(&lTm,
109f0 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65  &pTm);.  y.tm_ye
10a00 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d  ar = pTm.wYear -
10a10 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f   1900;.  y.tm_mo
10a20 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d  n = pTm.wMonth -
10a30 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20   1;.  y.tm_wday 
10a40 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b  = pTm.wDayOfWeek
10a50 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20  ;.  y.tm_mday = 
10a60 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d  pTm.wDay;.  y.tm
10a70 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75  _hour = pTm.wHou
10a80 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20  r;.  y.tm_min = 
10a90 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79  pTm.wMinute;.  y
10aa0 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53  .tm_sec = pTm.wS
10ab0 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20  econd;.  return 
10ac0 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  &y;.}.#endif..#i
10ad0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10ae0 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
10af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
10b30 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
10b40 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
10b50 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 64  inCE only..*/.#d
10b60 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
10b70 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
10b80 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
10b90 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28  [-(int)offsetof(
10ba0 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
10bb0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
10bc0 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
10bd0 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
10be0 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
10bf0 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
10c00 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
10c10 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
10c20 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
10c30 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
10c40 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
10c50 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
10c60 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
10c70 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
10c80 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
10c90 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
10ca0 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
10cb0 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
10cc0 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
10cd0 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
10ce0 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
10cf0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
10d00 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
10d10 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
10d20 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
10d30 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
10d40 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
10d50 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61  ic int winceCrea
10d60 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61  teLock(const cha
10d70 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69  r *zFilename, wi
10d80 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
10d90 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20   LPWSTR zTok;.  
10da0 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20  LPWSTR zName;.  
10db0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
10dc0 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20  .  BOOL bLogged 
10dd0 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20  = FALSE;.  BOOL 
10de0 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
10df0 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38   zName = winUtf8
10e00 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
10e10 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
10e20 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f  e==0 ){.    /* o
10e30 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
10e40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e50 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
10e60 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  PT;.  }..  /* In
10e70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
10e80 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
10e90 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
10ea0 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
10eb0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
10ec0 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
10ed0 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
10ee0 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
10ef0 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
10f00 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
10f10 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
10f20 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
10f30 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
10f40 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
10f50 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
10f60 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
10f70 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
10f80 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
10f90 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
10fa0 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
10fb0 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
10fc0 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
10fd0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
10fe0 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
10ff0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
11000 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11010 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71  tError();.    sq
11020 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
11030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
11040 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11050 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
11060 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
11090 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
110a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
110b0 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
110c0 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
110d0 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
110e0 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
110f0 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63  tex);..  /* Sinc
11100 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e  e the names of n
11110 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65  amed mutexes, se
11120 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d  maphores, file m
11130 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a  appings etc are.
11140 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74    ** case-sensit
11150 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74  ive, take advant
11160 61 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75  age of that by u
11170 70 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d  ppercasing the m
11180 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  utex name.  ** a
11190 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73  nd using that as
111a0 20 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65   the shared file
111b0 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20  mapping name..  
111c0 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72  */.  osCharUpper
111d0 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  W(zName);.  pFil
111e0 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43  e->hShared = osC
111f0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
11200 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  W(INVALID_HANDLE
11210 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20  _VALUE, NULL,.  
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57        PAGE_READW
11250 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28  RITE, 0, sizeof(
11260 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  winceLock),.    
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f      zName);..  /
112a0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
112b0 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
112c0 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
112d0 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
112e0 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74   so it.  ** must
112f0 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
11300 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72  ized */.  lastEr
11310 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11320 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61  rror();.  if (la
11330 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52  stErrno == ERROR
11340 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
11350 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
11360 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
11370 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
11380 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
11390 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
113a0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
113b0 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
113c0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  t. */.  if( pFil
113d0 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20  e->hShared ){.  
113e0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20    pFile->shared 
113f0 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73  = (winceLock*)os
11400 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
11410 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20  ile->hShared,.  
11420 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
11430 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
11440 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
11450 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
11460 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
11470 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
11480 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
11490 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
114a0 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
114b0 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72  if( !pFile->shar
114c0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
114d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
114e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
114f0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
11500 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
11510 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11520 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11530 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
11540 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
11550 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
11560 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
11570 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
11580 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
11590 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
115a0 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
115b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
115c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
115d0 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
115e0 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
115f0 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
11600 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  l */.  if( pFile
11610 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20  ->hShared==NULL 
11620 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67  ){.    if( !bLog
11630 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ged ){.      pFi
11640 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11650 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
11660 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11670 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
11680 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
116a0 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33  winceCreateLock3
116b0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
116c0 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
116d0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  RUE;.    }.    w
116e0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
116f0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11700 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
11710 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
11720 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
11730 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
11740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11750 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OERR;.  }..  /* 
11760 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
11770 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
11780 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
11790 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74  o */.  if( bInit
117a0 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
117b0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c  File->shared, 0,
117c0 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
117d0 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63  k));.  }..  winc
117e0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
117f0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
11800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72  ;.}../*.** Destr
11820 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77  oy the part of w
11830 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c  inFile that deal
11840 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63  s with wince loc
11850 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ks.*/.static voi
11860 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f  d winceDestroyLo
11870 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
11880 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  e){.  if (pFile-
11890 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a  >hMutex){.    /*
118a0 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
118b0 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
118c0 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
118d0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20  e->hMutex);..   
118e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
118f0 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20  g blocks should 
11900 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20  probably assert 
11910 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62  in debug mode, b
11920 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61  ut they.       a
11930 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e  re to cleanup in
11940 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20   case any locks 
11950 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f  remained open */
11960 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11970 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
11980 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
11990 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
119a0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  -;.    }.    if 
119b0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
119c0 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20  eserved){.      
119d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
119e0 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
119f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
11a00 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
11a10 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
11a20 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
11a30 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
11a40 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
11a50 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
11a60 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69  sive){.      pFi
11a70 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
11a80 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
11a90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
11aa0 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63  -reference and c
11ab0 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66  lose our copy of
11ac0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
11ad0 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ry handle */.   
11ae0 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
11af0 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  le(pFile->shared
11b00 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
11b10 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
11b20 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
11b30 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
11b40 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
11b50 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
11b60 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
11b70 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
11b80 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
11b90 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
11ba0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
11bb0 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
11bc0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
11bd0 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57  kFile() API of W
11be0 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
11bf0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
11c00 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  ceLockFile(.  LP
11c10 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
11c20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
11c30 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
11c40 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
11c50 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
11c60 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
11c70 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
11c80 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
11c90 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
11ca0 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
11cb0 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
11cc0 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
11cd0 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
11ce0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11cf0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
11d00 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
11d10 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
11d20 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
11d30 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
11d40 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
11d50 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
11d60 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
11d70 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
11d80 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
11d90 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
11da0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
11db0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
11dc0 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
11dd0 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
11de0 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
11df0 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
11e00 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
11e10 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
11e20 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
11e30 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
11e40 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
11e50 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11e60 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
11e70 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
11e80 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
11e90 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
11ea0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
11eb0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
11ec0 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
11ed0 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
11ee0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11ef0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11f00 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
11f10 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
11f20 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
11f30 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11f40 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
11f50 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11f60 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
11f70 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11f80 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
11f90 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
11fa0 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
11fb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11fc0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
11fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11fe0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11ff0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12000 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
12010 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
12020 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12030 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
12040 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20  DING_BYTE.      
12050 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
12060 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
12070 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
12080 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
12090 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
120a0 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
120b0 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
120c0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
120d0 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
120e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
120f0 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
12100 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
12110 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
12120 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
12130 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12140 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
12150 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
12160 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
12170 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12180 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
12190 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
121a0 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
121b0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
121c0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
121d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
121e0 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b  Reserved == 0) {
121f0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
12200 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
12210 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
12220 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
12230 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
12240 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12250 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
12260 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
12270 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
12280 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
12290 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  rn;.}../*.** An 
122a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
122b0 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  f the UnlockFile
122c0 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
122d0 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
122e0 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63   BOOL winceUnloc
122f0 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
12300 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
12310 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
12320 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
12330 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
12340 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
12350 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a  tesToUnlockLow,.
12360 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
12370 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
12380 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
12390 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
123a0 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
123b0 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
123c0 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
123d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
123e0 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
123f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12400 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
12410 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
12420 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  );..  if (!pFile
12430 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
12440 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
12450 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
12460 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
12470 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61   Releasing a rea
12480 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65  der lock or an e
12490 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
124a0 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
124b0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
124c0 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a  )SHARED_FIRST){.
124d0 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61      /* Did we ha
124e0 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
124f0 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20  lock? */.    if 
12500 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
12510 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
12520 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
12530 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
12540 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
12550 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  ED_SIZE);.      
12560 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
12570 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
12580 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
12590 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
125a0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
125b0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
125c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
125d0 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61  d we just have a
125e0 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f   reader lock? */
125f0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46  .    else if (pF
12600 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
12610 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ers){.      asse
12620 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
12630 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12640 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
12650 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE.             
12660 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  || nNumberOfByte
12670 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12680 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  1);.      pFile-
12690 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
126a0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  --;.      if (pF
126b0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
126c0 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  ers == 0).      
126d0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
126e0 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
126f0 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s --;.      }.  
12700 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
12710 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
12720 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
12730 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a  pending lock */.
12740 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
12750 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
12760 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54  WORD)PENDING_BYT
12770 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
12780 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12790 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
127a0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
127b0 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
127c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
127d0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46  cal.bPending = F
127e0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
127f0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
12800 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
12810 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12820 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  E;.    }.  }.  /
12830 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
12840 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  served lock */. 
12850 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
12860 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12870 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
12880 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
12890 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
128a0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
128b0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
128c0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
128d0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
128e0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
128f0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
12900 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12910 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
12920 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
12930 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
12940 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
12950 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
12960 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
12970 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  Return;.}./*.** 
12980 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69  End of the speci
12990 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63  al code for winc
129a0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
129b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
129f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12a00 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f  E_OS_WINCE */../
12a10 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65  *.** Lock a file
12a20 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74   region..*/.stat
12a30 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46  ic BOOL winLockF
12a40 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
12a50 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
12a60 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f  flags,.  DWORD o
12a70 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
12a80 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
12a90 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
12aa0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
12ab0 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
12ac0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
12ad0 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
12ae0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
12af0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
12b00 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
12b10 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
12b20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
12b30 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
12b40 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b  return winceLock
12b50 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
12b60 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
12b70 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
12b80 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
12b90 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
12ba0 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
12bb0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
12bc0 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
12bd0 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
12be0 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
12bf0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
12c00 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
12c10 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
12c20 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
12c30 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
12c40 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
12c50 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c  leEx(*phFile, fl
12c60 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ags, 0, numBytes
12c70 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
12c80 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
12c90 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
12ca0 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c  sLockFile(*phFil
12cb0 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
12cc0 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74  fsetHigh, numByt
12cd0 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  esLow,.         
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
12cf0 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
12d00 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12d10 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  Unlock a file re
12d20 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  gion.. */.static
12d30 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46   BOOL winUnlockF
12d40 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
12d50 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
12d60 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
12d70 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
12d80 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
12d90 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
12da0 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
12db0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
12dc0 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
12dd0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
12de0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
12df0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
12e00 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
12e10 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
12e20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  UnlockFile..  */
12e30 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55  .  return winceU
12e40 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  nlockFile(phFile
12e50 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
12e60 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
12e90 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
12ea0 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
12eb0 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
12ec0 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
12ed0 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
12ee0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
12ef0 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
12f00 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
12f10 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
12f20 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
12f30 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
12f40 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70  sUnlockFileEx(*p
12f50 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74  hFile, 0, numByt
12f60 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
12f70 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
12f80 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
12f90 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70   osUnlockFile(*p
12fa0 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
12fb0 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
12fc0 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
12ff0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
13000 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13050 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
13060 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70   of routines imp
13070 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d  lement the I/O m
13080 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64  ethods specified
13090 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74  .** by the sqlit
130a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
130b0 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ject..**********
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13100 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  ****/../*.** Som
13110 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
13120 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
13130 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
13140 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53  ifndef INVALID_S
13150 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
13160 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44  # define INVALID
13170 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
13180 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  R ((DWORD)-1).#e
13190 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
131a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
131b0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ition of the fil
131c0 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
131d0 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
131e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
131f0 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
13200 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
13210 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
13220 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  n 0..** Otherwis
13230 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61  e, set pFile->la
13240 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75  stErrno and retu
13250 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
13260 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
13270 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  ekFile(winFile *
13280 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
13290 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23  nt64 iOffset){.#
132a0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
132b0 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  NRT.  LONG upper
132c0 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
132d0 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
132e0 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
132f0 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
13300 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13320 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
13330 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
13340 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
13350 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
13360 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
13370 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
13380 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
13390 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
133a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
133b0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
133c0 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
133d0 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52  ror() */..  OSTR
133e0 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
133f0 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c  %p, offset=%lld\
13400 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f  n", pFile->h, iO
13410 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65  ffset));..  uppe
13420 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
13430 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
13440 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
13450 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
13460 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
13470 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
13480 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
13490 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
134a0 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
134b0 73 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63  s a dword.  ** c
134c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
134d0 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
134e0 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
134f0 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
13500 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
13510 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
13520 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
13530 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
13540 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49   to MSDN,.  ** I
13550 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
13560 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f  POINTER may also
13570 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20   be a valid new 
13580 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65  offset. So to de
13590 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65  termine.  ** whe
135a0 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61  ther an error ha
135b0 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72  s actually occur
135c0 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20  red, it is also 
135d0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c  necessary to cal
135e0 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72  l.  ** GetLastEr
135f0 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77  ror()..  */.  dw
13600 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
13610 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c  ointer(pFile->h,
13620 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70   lowerBits, &upp
13630 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47  erBits, FILE_BEG
13640 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52  IN);..  if( (dwR
13650 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  et==INVALID_SET_
13660 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20  FILE_POINTER.   
13670 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
13680 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
13690 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
136a0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
136b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
136c0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
136d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
136e0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
136f0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
13700 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
13710 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
13720 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
13730 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
13740 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13750 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
13760 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13770 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
13780 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
13790 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
137a0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
137b0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
137c0 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a  .#else.  /*.  **
137d0 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20   Same as above, 
137e0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73  except that this
137f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13800 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e  works for WinRT.
13810 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49  .  */..  LARGE_I
13820 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20  NTEGER x;       
13830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13840 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
13850 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20  BOOL bRet;      
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
13880 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
13890 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e  terEx() */..  x.
138a0 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73  QuadPart = iOffs
138b0 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53  et;.  bRet = osS
138c0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
138d0 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20  pFile->h, x, 0, 
138e0 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
138f0 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70  if(!bRet){.    p
13900 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13910 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13920 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
13930 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
13940 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
13950 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
13960 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
13970 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
13980 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
13990 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
139a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
139b0 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
139c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
139d0 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
139e0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
139f0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
13a00 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
13a10 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
13a20 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ndif.}..#if SQLI
13a30 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
13a40 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  >0./* Forward re
13a50 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
13a60 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75  helper methods u
13a70 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d  sed for memory m
13a80 61 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73  apped files */.s
13a90 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70  tatic int winMap
13aa0 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73  file(winFile*, s
13ab0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73  qlite3_int64);.s
13ac0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d  tatic int winUnm
13ad0 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29  apfile(winFile*)
13ae0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
13af0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
13b00 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
13b10 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
13b20 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
13b30 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
13b40 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
13b50 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
13b60 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
13b70 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69  t, but Windows i
13b80 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
13b90 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
13ba0 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
13bb0 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
13bc0 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
13bd0 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
13be0 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
13bf0 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
13c00 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
13c10 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
13c20 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
13c30 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
13c40 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
13c50 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
13c60 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
13c70 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
13c80 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
13c90 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
13ca0 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
13cb0 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
13cc0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
13cd0 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
13ce0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
13cf0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
13d00 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
13d10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13d20 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65  _OMIT_WAL.  asse
13d30 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
13d40 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  =0 );.#endif.  a
13d50 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21  ssert( pFile->h!
13d60 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e  =NULL && pFile->
13d70 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
13d80 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54  E_VALUE );.  OST
13d90 52 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64  RACE(("CLOSE pid
13da0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
13db0 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  file=%p\n",.    
13dc0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
13dd0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13de0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
13df0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
13e00 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
13e10 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
13e20 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ile);.#endif..  
13e30 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43  do{.    rc = osC
13e40 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
13e50 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
13e60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
13e70 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
13e80 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
13e90 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
13ea0 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
13eb0 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
13ec0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
13ed0 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
13ee0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13ef0 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
13f00 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
13f10 50 54 53 20 33 0a 20 20 7b 0a 20 20 20 20 77 69  PTS 3.  {.    wi
13f20 6e 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70  nVfsAppData *pAp
13f30 70 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41  pData = (winVfsA
13f40 70 70 44 61 74 61 2a 29 70 46 69 6c 65 2d 3e 70  ppData*)pFile->p
13f50 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20  Vfs->pAppData;. 
13f60 20 20 20 69 66 28 20 70 41 70 70 44 61 74 61 3d     if( pAppData=
13f70 3d 4e 55 4c 4c 20 7c 7c 20 21 70 41 70 70 44 61  =NULL || !pAppDa
13f80 74 61 2d 3e 62 4e 6f 4c 6f 63 6b 20 29 7b 0a 20  ta->bNoLock ){. 
13f90 20 20 20 20 20 77 69 6e 63 65 44 65 73 74 72 6f       winceDestro
13fa0 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
13fb0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46    }.  }.  if( pF
13fc0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
13fd0 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
13fe0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
13ff0 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
14000 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
14010 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
14020 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
14030 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
14040 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
14050 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
14060 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20  ffffffff.       
14070 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43   && cnt++ < WINC
14080 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
14090 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  PTS.    ){.     
140a0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
140b0 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20  sleep(100);  /* 
140c0 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65  Wait a little be
140d0 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69  fore trying agai
140e0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  n */.    }.    s
140f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
14100 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
14110 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
14120 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
14130 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a  File->h = NULL;.
14140 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65    }.  OpenCounte
14150 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45  r(-1);.  OSTRACE
14160 28 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  (("CLOSE pid=%lu
14170 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14180 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
14190 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
141a0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
141b0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
141c0 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
141d0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
141e0 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
141f0 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
14200 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  : winLogError(SQ
14210 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
14220 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
14230 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14250 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d  inClose", pFile-
14260 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >zPath);.}../*.*
14270 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
14280 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
14290 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
142a0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
142b0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
142c0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
142d0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
142e0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
142f0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
14300 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61  tatic int winRea
14310 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
14320 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
14330 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20  /* File to read 
14340 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  from */.  void *
14350 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
14360 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f       /* Write co
14370 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20  ntent into this 
14380 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
14390 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
143a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
143b0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
143c0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
143d0 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
143e0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
143f0 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65  ng at this offse
14400 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c  t */.){.#if !SQL
14410 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
14420 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14430 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
14440 50 45 44 29 0a 20 20 4f 56 45 52 4c 41 50 50 45  PED).  OVERLAPPE
14450 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
14460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66         /* The of
14470 66 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c  fset for ReadFil
14480 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77  e. */.#endif.  w
14490 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
144a0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
144b0 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
144c0 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
144f0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
14500 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
14510 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
14520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14530 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14540 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
14550 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
14560 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
14570 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
14580 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  t>=0 );.  Simula
14590 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
145a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
145b0 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AD);.  OSTRACE((
145c0 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
145d0 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
145e0 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
145f0 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  unt=%d, ".      
14600 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c       "offset=%ll
14610 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f  d, lock=%d\n", o
14620 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14630 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
14640 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14650 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
14660 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
14670 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
14680 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
14690 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
146a0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
146b0 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
146c0 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
146d0 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
146e0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
146f0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
14700 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
14710 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
14720 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14730 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
14740 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
14750 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14760 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
14770 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
14780 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
14790 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
147a0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
147b0 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  MMAP pid=%lu, pF
147c0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
147d0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
147e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
147f0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14800 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14810 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14830 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
14840 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
14850 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
14860 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
14870 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14880 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
14890 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
148a0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
148b0 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
148c0 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
148d0 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
148e0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
148f0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
14900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14910 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
14920 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e  S_WINCE || defin
14930 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
14940 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
14950 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
14960 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20  (pFile, offset) 
14970 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
14980 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
14990 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
149a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
149b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
149c0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
149d0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
149e0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
149f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a00 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  FULL;.  }.  whil
14a10 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
14a20 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
14a30 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29  mt, &nRead, 0) )
14a40 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74  {.#else.  memset
14a50 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
14a60 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
14a70 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  ED));.  overlapp
14a80 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
14a90 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
14aa0 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c  ffffff);.  overl
14ab0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
14ac0 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
14ad0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
14ae0 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  fff);.  while( !
14af0 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
14b00 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
14b10 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70  &nRead, &overlap
14b20 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20  ped) &&.        
14b30 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14b40 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  )!=ERROR_HANDLE_
14b50 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  EOF ){.#endif.  
14b60 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
14b70 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65  o;.    if( winRe
14b80 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
14b90 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
14ba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
14bb0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14bc0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
14bd0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
14be0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
14bf0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
14c00 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c  LITE_IOERR_READ\
14c10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14c20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14c30 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14c40 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14c50 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14c60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14c70 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
14c80 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
14cb0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
14cc0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74  winLogIoerr(nRet
14cd0 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  ry, __LINE__);. 
14ce0 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
14cf0 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
14d00 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
14d10 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
14d20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
14d30 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
14d40 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
14d50 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
14d60 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
14d70 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
14d80 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14d90 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14da0 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c  R_SHORT_READ\n",
14db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
14dc0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14dd0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
14de0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14e00 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
14e10 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  }..  OSTRACE(("R
14e20 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
14e30 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14e40 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
14e50 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
14e60 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14e70 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14e80 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
14e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14ea0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
14eb0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
14ec0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
14ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
14ee0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
14ef0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
14f00 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
14f10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14f20 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
14f30 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
14f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
14f50 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
14f60 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
14f70 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
14f80 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
14f90 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
14fa0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14fd0 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
14fe0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
14ff0 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
15000 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
15010 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
15020 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
15030 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
15040 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15060 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
15070 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
15080 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
15090 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
150a0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
150b0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
150c0 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150e0 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
150f0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
15100 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
15110 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
15120 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
15130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15140 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
15150 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
15160 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
15170 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
15180 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c  E(("WRITE pid=%l
15190 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
151a0 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
151b0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20   amount=%d, ".  
151c0 20 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74           "offset
151d0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
151e0 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
151f0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
15200 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  e,.           pF
15210 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
15220 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65  t, offset, pFile
15230 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
15240 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
15250 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
15260 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
15270 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
15280 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
15290 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
152a0 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
152b0 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
152c0 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
152d0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
152e0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
152f0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
15300 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
15310 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
15320 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
15330 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15340 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
15350 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
15360 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
15370 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
15380 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
15390 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 70 69 64  ("WRITE-MMAP pid
153a0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
153b0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
153c0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
153d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
153e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
153f0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
15400 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
15410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
15420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15430 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
15440 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15450 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
15460 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
15470 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
15480 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
15490 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
154a0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
154b0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
154c0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
154d0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
154e0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
154f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
15500 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15510 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15520 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
15530 41 50 50 45 44 29 0a 20 20 72 63 20 3d 20 77 69  APPED).  rc = wi
15540 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
15550 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
15560 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20  rc==0 ){.#else. 
15570 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53   {.#endif.#if !S
15580 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
15590 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
155a0 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
155b0 41 50 50 45 44 29 0a 20 20 20 20 4f 56 45 52 4c  APPED).    OVERL
155c0 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64  APPED overlapped
155d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
155e0 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65  offset for Write
155f0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
15600 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28      u8 *aRem = (
15610 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20  u8 *)pBuf;      
15620 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f    /* Data yet to
15630 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
15640 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d     int nRem = am
15650 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
15660 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
15670 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72  tes yet to be wr
15680 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f  itten */.    DWO
15690 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  RD nWrite;      
156a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
156b0 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65  tes written by e
156c0 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20  ach WriteFile() 
156d0 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52  call */.    DWOR
156e0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
156f0 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c  _ERROR;   /* Val
15700 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47  ue returned by G
15710 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f  etLastError() */
15720 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
15730 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
15740 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
15750 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
15760 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c     memset(&overl
15770 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
15780 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
15790 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
157a0 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
157b0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
157c0 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  f);.    overlapp
157d0 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
157e0 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
157f0 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
15800 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77  );.#endif..    w
15810 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
15820 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
15830 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  NCE || defined(S
15840 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
15850 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20  VERLAPPED).     
15860 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
15870 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
15880 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
15890 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20   0) ){.#else.   
158a0 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
158b0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
158c0 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
158d0 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  e, &overlapped) 
158e0 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ){.#endif.      
158f0 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
15900 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
15910 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
15920 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
15930 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15940 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
15950 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
15960 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
15970 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
15980 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
15990 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
159a0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
159b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
159c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
159d0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
159e0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
159f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15a00 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
15a10 50 45 44 29 0a 20 20 20 20 20 20 6f 66 66 73 65  PED).      offse
15a20 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
15a30 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
15a40 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
15a50 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
15a60 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  f);.      overla
15a70 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
15a80 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
15a90 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
15aa0 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ff);.#endif.    
15ab0 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65    aRem += nWrite
15ac0 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
15ad0 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20  nWrite;.    }.  
15ae0 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a    if( nRem>0 ){.
15af0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
15b00 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
15b10 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  no;.      rc = 1
15b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15b30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
15b40 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74     ( pFile->last
15b50 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e  Errno==ERROR_HAN
15b60 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a  DLE_DISK_FULL ).
15b70 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c         || ( pFil
15b80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
15b90 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29  ROR_DISK_FULL ))
15ba0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
15bb0 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
15bc0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
15bd0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
15be0 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  LL\n",.         
15bf0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
15c00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15c10 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
15c20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
15c30 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15c40 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c  E_FULL, pFile->l
15c50 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20     "winWrite1", 
15c80 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15c90 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45     }.    OSTRACE
15ca0 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
15cb0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
15cc0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
15cd0 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20  OERR_WRITE\n",. 
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
15cf0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15d00 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
15d10 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
15d20 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
15d30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
15d40 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
15d50 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15d60 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15d70 57 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  Write2", pFile->
15d80 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
15d90 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
15da0 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f  (nRetry, __LINE_
15db0 5f 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  _);.  }.  OSTRAC
15dc0 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c  E(("WRITE pid=%l
15dd0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
15de0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15df0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
15e00 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
15e10 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15e20 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
15e50 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
15e60 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
15e70 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
15e80 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
15e90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15ea0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
15eb0 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
15ec0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
15ed0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
15ee0 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
15ef0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15f00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
15f10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15f20 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
15f30 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20  tion */.  DWORD 
15f40 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73  lastErrno;..  as
15f50 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15f60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15f70 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
15f80 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a  OERR_TRUNCATE);.
15f90 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
15fa0 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  CATE pid=%lu, pF
15fb0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
15fc0 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b   size=%lld, lock
15fd0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15fe0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
15ff0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
16000 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  e, pFile->h, nBy
16010 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  te, pFile->lockt
16020 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
16030 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
16040 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
16050 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
16060 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
16070 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
16080 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
16090 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
160a0 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
160b0 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
160c0 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
160d0 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
160e0 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
160f0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
16100 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
16110 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16120 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
16130 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
16140 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
16150 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
16160 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
16170 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
16180 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65   /* SetEndOfFile
16190 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  () returns non-z
161a0 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73  ero when success
161b0 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65  ful, or zero whe
161c0 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  n it fails. */. 
161d0 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
161e0 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29  (pFile, nByte) )
161f0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
16200 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
16210 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
16220 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
16250 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
16260 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
16270 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
16280 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20  e(pFile->h) &&. 
16290 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73             ((las
162a0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
162b0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
162c0 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49  R_USER_MAPPED_FI
162d0 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LE) ){.    pFile
162e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
162f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
16300 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
16310 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
16320 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
16330 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
16340 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
16350 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c  Truncate2", pFil
16360 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
16370 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16380 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
16390 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
163a0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73  truncated to a s
163b0 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  ize smaller than
163c0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   the currently. 
163d0 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f   ** mapped regio
163e0 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66  n, reduce the ef
163f0 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20  fective mapping 
16400 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51  size as well. SQ
16410 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75  Lite will.  ** u
16420 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
16430 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
16440 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
16450 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
16460 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
16470 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
16480 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d   && nByte<pFile-
16490 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
164a0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
164b0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65   = nByte;.  }.#e
164c0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
164d0 28 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25  ("TRUNCATE pid=%
164e0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
164f0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
16500 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
16510 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
16520 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
16530 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
16540 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
16550 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
16560 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
16570 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
16580 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
16590 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
165a0 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
165b0 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
165c0 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
165d0 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
165e0 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
165f0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
16600 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
16610 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
16620 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
16630 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16640 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
16650 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
16660 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
16670 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
16680 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
16690 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69  int winSync(sqli
166a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
166b0 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65  t flags){.#ifnde
166c0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
166d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
166e0 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45  only when SQLITE
166f0 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
16700 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20  defined..   */. 
16710 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66   BOOL rc;.#endif
16720 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
16730 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65  EBUG) || !define
16740 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  d(SQLITE_NO_SYNC
16750 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e  ) || \.    defin
16760 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
16770 53 5f 54 52 41 43 45 29 0a 20 20 2f 2a 0a 20 20  S_TRACE).  /*.  
16780 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c  ** Used when SQL
16790 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
167a0 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62  ot defined and b
167b0 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61  y the assert() a
167c0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41  nd/or.  ** OSTRA
167d0 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20  CE() macros..   
167e0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
167f0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
16800 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
16810 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
16820 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
16830 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
16840 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
16850 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
16860 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
16870 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
16880 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
16890 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
168a0 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
168b0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
168c0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
168d0 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
168e0 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
168f0 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
16900 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
16910 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
16920 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
16930 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
16940 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
16950 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
16960 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
16970 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
16980 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
16990 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
169a0 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46  SYNC pid=%lu, pF
169b0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
169c0 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
169d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
169e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
169f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
16a00 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67  , pFile->h, flag
16a10 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  s,.           pF
16a20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
16a30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16a40 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
16a50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
16a60 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
16a70 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
16a80 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
16a90 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
16aa0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
16ab0 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
16ac0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
16ad0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
16ae0 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
16af0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
16b00 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
16b10 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
16b20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16b30 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54  TE_NO_SYNC.  OST
16b40 52 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20  RACE(("SYNC-NOP 
16b50 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
16b60 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
16b70 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
16b80 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16b90 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16ba0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16bb0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
16bc0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69  ITE_OK;.#else.#i
16bd0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
16be0 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
16bf0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
16c00 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 46 6c   ){.    if( osFl
16c10 75 73 68 56 69 65 77 4f 66 46 69 6c 65 28 70 46  ushViewOfFile(pF
16c20 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  ile->pMapRegion,
16c30 20 30 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54   0) ){.      OST
16c40 52 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50  RACE(("SYNC-MMAP
16c50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
16c60 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25  %p, pMapRegion=%
16c70 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  p, ".           
16c80 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 4f      "rc=SQLITE_O
16c90 4b 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  K\n", osGetCurre
16ca0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20  ntProcessId(),. 
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
16cc0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  ile, pFile->pMap
16cd0 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 65  Region));.    }e
16ce0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
16cf0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
16d00 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
16d10 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16d20 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c  SYNC-MMAP pid=%l
16d30 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
16d40 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
16d60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
16d70 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
16d80 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a  entProcessId(),.
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16da0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61  File, pFile->pMa
16db0 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
16dc0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16dd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16de0 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
16df0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 22 77 69 6e 53 79 6e 63 31 22 2c 20 70 46    "winSync1", pF
16e20 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
16e30 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
16e40 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
16e50 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
16e60 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
16e70 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
16e80 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
16e90 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16ea0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
16eb0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
16ec0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
16ed0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16ee0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16ef0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16f00 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16f20 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
16f30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
16f40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16f50 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
16f60 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  C pid=%lu, pFile
16f70 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
16f80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
16f90 59 4e 43 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  YNC\n",.        
16fa0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16fb0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16fc0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
16fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
16fe0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
16ff0 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
17000 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 20 22 77 69 6e 53 79 6e 63 32 22 2c       "winSync2",
17030 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17040 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
17050 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
17060 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
17070 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
17080 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
17090 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  winFileSize(sqli
170a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
170b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
170c0 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ze){.  winFile *
170d0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
170e0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
170f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
17100 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
17110 20 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21    assert( pSize!
17120 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
17130 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
17140 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
17150 54 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  T);.  OSTRACE(("
17160 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
17170 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  ize=%p\n", pFile
17180 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23  ->h, pSize));..#
17190 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
171a0 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f  RT.  {.    FILE_
171b0 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e  STANDARD_INFO in
171c0 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  fo;.    if( osGe
171d0 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
171e0 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
171f0 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72  ->h, FileStandar
17200 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  dInfo,.         
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66              &inf
17230 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
17240 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
17250 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c   = info.EndOfFil
17260 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20  e.QuadPart;.    
17270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
17280 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17290 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
172a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
172b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
172c0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
172d0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
17300 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
17310 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
17320 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52  lse.  {.    DWOR
17330 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20  D upperBits;.   
17340 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73   DWORD lowerBits
17350 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  ;.    DWORD last
17360 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65  Errno;..    lowe
17370 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
17380 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
17390 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20  &upperBits);.   
173a0 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
173b0 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
173c0 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
173d0 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20  erBits;.    if( 
173e0 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20    (lowerBits == 
173f0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a  INVALID_FILE_SIZ
17400 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c  E).       && ((l
17410 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
17420 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
17430 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20  _ERROR) ){.     
17440 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17450 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
17460 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
17470 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
17480 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
17490 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
174c0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
174d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
174e0 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  f.  OSTRACE(("SI
174f0 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
17500 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c  e=%p, *pSize=%ll
17510 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
17520 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
17530 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c  , pSize, *pSize,
17540 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
17550 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
17560 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
17570 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17580 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
17590 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
175a0 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
175b0 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
175c0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
175d0 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
175e0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
175f0 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
17600 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
17610 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
17620 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
17630 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
17640 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
17650 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
17660 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
17670 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
17680 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
17690 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
176a0 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
176b0 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
176c0 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
176d0 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
176e0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
176f0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
17700 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
17710 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
17720 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
17730 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
17740 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
17750 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
17760 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
17770 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
17780 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
17790 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
177a0 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
177b0 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
177c0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
177d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
177e0 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
177f0 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
17800 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
17810 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17820 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
17850 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
17860 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
17870 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
17880 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
17890 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
178a0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
178b0 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
178c0 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
178d0 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
178e0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
178f0 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
17900 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
17910 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
17920 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
17930 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
17940 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
17950 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
17960 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
17970 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
17980 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
17990 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
179a0 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
179b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
179c0 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
179d0 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
179e0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52  atic int winGetR
179f0 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
17a00 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
17a10 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
17a20 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
17a30 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
17a40 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17a50 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
17a60 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
17a70 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
17a80 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  E.    /*.    ** 
17a90 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
17aa0 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
17ab0 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
17ac0 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
17ad0 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20   Win32.    **   
17ae0 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
17af0 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  Ex..    */.    r
17b00 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69  es = winceLockFi
17b10 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
17b20 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31  ARED_FIRST, 0, 1
17b30 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
17b40 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
17b50 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
17b60 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
17b70 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52  LAGS, SHARED_FIR
17b80 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ST, 0,.         
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17ba0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65  RED_SIZE, 0);.#e
17bb0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
17bc0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
17bd0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
17be0 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71    int lk;.    sq
17bf0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
17c00 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
17c10 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  );.    pFile->sh
17c20 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
17c30 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37  short)((lk & 0x7
17c40 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
17c50 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20  _SIZE - 1));.   
17c60 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
17c70 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
17c80 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
17c90 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
17ca0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17cb0 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
17cc0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
17cd0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
17ce0 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d  dif.  if( res ==
17cf0 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
17d00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
17d10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
17d20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
17d30 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74   log a failure t
17d40 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  o lock */.  }.  
17d50 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
17d60 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
17d70 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ult=%d\n", pFile
17d80 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65  ->h, res));.  re
17d90 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
17da0 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f  ** Undo a readlo
17db0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ck.*/.static int
17dc0 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
17dd0 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
17de0 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
17df0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
17e00 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
17e10 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
17e20 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
17e30 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17e40 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
17e50 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
17e60 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
17e70 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17e80 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
17e90 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
17ea0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
17eb0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
17ec0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
17ed0 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
17ee0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17ef0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
17f00 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
17f10 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  e, 0, 1, 0);.  }
17f20 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65  .#endif.  if( re
17f30 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72  s==0 && ((lastEr
17f40 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
17f50 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e  rror())!=ERROR_N
17f60 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20  OT_LOCKED) ){.  
17f70 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17f80 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
17f90 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
17fa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
17fb0 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  OCK, pFile->last
17fc0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17fd0 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63         "winUnloc
17fe0 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c  kReadLock", pFil
17ff0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
18000 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
18010 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
18020 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46  result=%d\n", pF
18030 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
18040 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
18050 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
18060 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
18070 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
18080 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
18090 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
180a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
180b0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
180c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
180d0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
180e0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
180f0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
18100 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
18110 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
18120 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
18130 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
18140 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
18150 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
18160 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
18170 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
18180 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
18190 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
181a0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
181b0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
181c0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
181d0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
181e0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
181f0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
18200 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
18210 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
18220 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
18230 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
18240 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
18250 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
18260 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
18270 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
18280 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
18290 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
182a0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
182b0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
182c0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
182d0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
182e0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
182f0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
18300 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
18310 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
18320 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
18330 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
18340 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
18350 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
18360 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
18370 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
18380 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
18390 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
183a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
183b0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
183c0 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
183d0 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
183e0 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
183f0 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
18400 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
18410 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
18420 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18430 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
18440 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18450 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
18460 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
18470 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
18480 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
18490 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
184a0 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
184b0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
184c0 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
184d0 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
184e0 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
184f0 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
18500 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
18510 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
18520 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
18530 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
18540 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
18550 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
18560 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
18570 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
18580 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
18590 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
185a0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
185b0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "LOCK file=%p, o
185c0 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
185d0 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
185e0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
185f0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
18600 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
18610 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
18620 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
18630 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
18640 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
18650 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
18660 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
18670 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
18680 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
18690 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
186a0 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
186b0 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
186c0 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
186d0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
186e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
186f0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
18700 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
18710 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c  TRACE(("LOCK-HEL
18720 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
18730 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
18740 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
18750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18760 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  }..  /* Do not a
18770 6c 6c 6f 77 20 61 6e 79 20 6b 69 6e 64 20 6f 66  llow any kind of
18780 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61   write-lock on a
18790 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
187a0 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ase.  */.  if( (
187b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
187c0 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
187d0 59 29 21 3d 30 20 26 26 20 6c 6f 63 6b 74 79 70  Y)!=0 && locktyp
187e0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
187f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
18810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
18820 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
18830 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
18840 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
18850 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
18860 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
18870 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
18880 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
18890 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
188a0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
188b0 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
188c0 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
188d0 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
188e0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
188f0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
18900 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
18910 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
18920 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
18930 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
18940 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
18950 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
18960 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
18970 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
18980 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
18990 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
189a0 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
189b0 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
189c0 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
189d0 74 79 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c  type;.  if( pFil
189e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
189f0 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b  LOCK.   || (lock
18a00 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
18a10 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
18a20 6f 63 6b 74 79 70 65 3c 3d 52 45 53 45 52 56 45  ocktype<=RESERVE
18a30 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  D_LOCK).  ){.   
18a40 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
18a50 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
18a60 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f   && (res = winLo
18a70 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
18a80 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
18a90 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
18ad0 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
18ae0 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
18af0 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
18b00 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
18b10 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
18b20 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61   work.      ** a
18b30 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
18b40 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e  aused by indexin
18b50 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69  g and/or anti-vi
18b60 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a  rus software on.
18b70 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73        ** Windows
18b80 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
18b90 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73  ** If you are us
18ba0 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73  ing this code as
18bb0 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74   a model for alt
18bc0 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20  ernative VFSes, 
18bd0 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  do not.      ** 
18be0 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20  copy this retry 
18bf0 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20  logic.  It is a 
18c00 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f  hack intended fo
18c10 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a  r Windows only..
18c20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c        */.      l
18c30 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
18c40 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
18c50 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
18c60 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66  K-PENDING-FAIL f
18c70 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64  ile=%p, count=%d
18c80 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a  , result=%d\n",.
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18ca0 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65  File->h, cnt, re
18cb0 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  s));.      if( l
18cc0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
18cd0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29  INVALID_HANDLE )
18ce0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
18cf0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
18d00 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
18d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
18d20 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
18d30 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46  OSTRACE(("LOCK-F
18d40 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75  AIL file=%p, cou
18d50 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  nt=%d, rc=%s\n",
18d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d70 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c    pFile->h, cnt,
18d80 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18d90 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
18da0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18db0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  }.      if( cnt 
18dc0 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
18dd0 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
18de0 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
18df0 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
18e00 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
18e10 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
18e20 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
18e30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
18e40 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
18e50 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
18e60 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
18e70 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
18e80 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18e90 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
18ea0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
18eb0 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
18ec0 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
18ed0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
18ee0 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
18ef0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
18f00 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
18f10 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
18f20 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
18f30 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
18f40 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
18f50 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
18f60 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
18f70 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
18f80 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
18f90 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
18fa0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
18fb0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
18fc0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
18fd0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
18fe0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
18ff0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
19000 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
19010 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45  wLocktype = RESE
19020 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RVED_LOCK;.    }
19030 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
19040 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
19050 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
19060 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
19070 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
19080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
19090 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
190a0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
190b0 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
190c0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
190d0 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
190e0 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
190f0 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
19100 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
19110 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
19120 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
19130 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
19140 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
19150 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
19160 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
19170 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
19180 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73  (pFile);.    res
19190 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
191a0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
191b0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
191c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
191d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
191e0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
191f0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
19200 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
19210 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
19220 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
19230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
19240 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
19250 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
19260 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
19270 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
19280 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
19290 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
192a0 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
192b0 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
192c0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
192d0 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
192e0 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
192f0 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
19300 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
19310 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
19320 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
19330 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
19340 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
19350 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
19360 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
19370 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
19380 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19390 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
193a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
193b0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
193c0 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
193d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
193e0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
193f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
19400 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
19410 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
19420 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  USY;.    OSTRACE
19430 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
19440 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c  e=%p, wanted=%d,
19450 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   got=%d\n",.    
19460 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19470 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77  h, locktype, new
19480 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a  Locktype));.  }.
19490 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
194a0 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
194b0 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
194c0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  "LOCK file=%p, l
194d0 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
194e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
194f0 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
19500 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
19510 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
19520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19530 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19540 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
19550 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
19560 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
19570 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
19580 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
19590 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
195a0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
195b0 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
195c0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
195d0 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
195e0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
195f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
19600 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19610 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
19620 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e    int res;.  win
19630 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
19640 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
19650 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19670 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
19680 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52  DLOCK; );.  OSTR
19690 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
196a0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
196b0 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Out=%p\n", pFile
196c0 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ->h, pResOut));.
196d0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
196e0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
196f0 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
19700 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
19710 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54  res = 1;.    OST
19720 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
19730 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
19740 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e  ult=%d (local)\n
19750 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
19760 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
19770 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
19780 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
19790 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
197a0 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42  FLAGS,RESERVED_B
197b0 59 54 45 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  YTE,0,1,0);.    
197c0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
197d0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
197e0 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
197f0 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
19800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73  );.    }.    res
19810 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f 53 54   = !res;.    OST
19820 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
19830 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
19840 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c  ult=%d (remote)\
19850 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
19860 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  s));.  }.  *pRes
19870 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54  Out = res;.  OST
19880 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
19890 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
198a0 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
198b0 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
198c0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
198d0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73    pFile->h, pRes
198e0 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
198f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19900 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
19910 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
19920 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
19930 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c  scriptor id to l
19940 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
19950 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
19960 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
19970 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
19980 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
19990 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
199a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
199b0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
199c0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
199d0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
199e0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
199f0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19a00 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  *.** It is not p
19a10 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
19a20 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c   routine to fail
19a30 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
19a40 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f  rgument.** is NO
19a50 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73  _LOCK.  If the s
19a60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
19a70 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68  s SHARED_LOCK th
19a80 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
19a90 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ** might return 
19aa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f  SQLITE_IOERR;.*/
19ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
19ac0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
19ad0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
19ae0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
19af0 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  e;.  winFile *pF
19b00 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
19b10 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
19b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
19b30 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
19b40 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
19b50 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
19b60 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
19b70 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  NLOCK file=%p, o
19b80 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
19b90 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
19ba0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19bb0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
19bc0 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
19bd0 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
19be0 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  ype));.  type = 
19bf0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
19c00 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
19c10 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
19c20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
19c30 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
19c40 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
19c50 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
19c60 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
19c70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
19c80 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
19c90 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
19ca0 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
19cb0 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
19cc0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
19cd0 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
19ce0 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
19cf0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
19d00 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
19d10 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
19d20 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61  _UNLOCK, osGetLa
19d30 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70    "winUnlock", p
19d60 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
19d70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79    }.  }.  if( ty
19d80 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
19d90 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
19da0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
19db0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19dc0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
19dd0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
19de0 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
19df0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
19e00 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64     winUnlockRead
19e10 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d  Lock(pFile);.  }
19e20 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
19e30 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
19e40 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
19e50 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
19e60 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
19e70 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
19e80 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
19e90 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43  cktype;.  OSTRAC
19ea0 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  E(("UNLOCK file=
19eb0 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d  %p, lock=%d, rc=
19ec0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
19ed0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
19ee0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c  e->locktype, sql
19ef0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
19f00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19f10 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
19f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f60 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
19f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f80 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
19f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19fb0 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
19fc0 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
19fd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
19fe0 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
19ff0 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
1a000 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
1a010 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
1a020 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
1a030 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
1a040 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1a050 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
1a060 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
1a070 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
1a080 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
1a090 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
1a0a0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
1a0b0 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
1a0c0 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
1a0d0 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
1a0e0 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
1a0f0 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
1a100 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
1a110 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
1a120 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
1a130 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
1a140 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
1a150 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
1a160 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
1a170 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
1a180 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a190 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
1a1a0 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
1a1b0 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
1a1c0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
1a1d0 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
1a1e0 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
1a1f0 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
1a200 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
1a210 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
1a220 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
1a230 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
1a240 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
1a250 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
1a260 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
1a270 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1a280 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
1a290 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f  atic int winNolo
1a2a0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
1a2b0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
1a2c0 6b 74 79 70 65 29 7b 0a 20 20 55 4e 55 53 45 44  ktype){.  UNUSED
1a2d0 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
1a2e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1a2f0 45 52 28 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  ER(locktype);.  
1a300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a310 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1a320 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  winNolockCheckRe
1a330 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
1a340 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1a350 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e   *pResOut){.  UN
1a360 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
1a370 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1a380 41 4d 45 54 45 52 28 70 52 65 73 4f 75 74 29 3b  AMETER(pResOut);
1a390 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a3a0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
1a3b0 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f  nt winNolockUnlo
1a3c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
1a3d0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
1a3e0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
1a3f0 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e  AMETER(id);.  UN
1a400 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c  USED_PARAMETER(l
1a410 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75  ocktype);.  retu
1a420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a430 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1a440 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1a450 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
1a460 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a480 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1a490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1a4d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
1a4e0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65   is initially ne
1a4f0 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
1a500 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
1a510 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
1a520 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
1a530 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1a540 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
1a550 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
1a560 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
1a570 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
1a580 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
1a590 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
1a5a0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1a5b0 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
1a5c0 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69  id winModeBit(wi
1a5d0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  nFile *pFile, un
1a5e0 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1a5f0 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1a600 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1a610 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1a620 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1a630 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1a640 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1a650 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1a660 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1a670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a680 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1a690 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1a6a0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1a6b0 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
1a6c0 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
1a6d0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1a6e0 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  iles */.static i
1a6f0 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  nt winGetTempnam
1a700 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
1a710 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69   char **);.stati
1a720 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
1a730 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74  onst void *);.st
1a740 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
1a750 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
1a760 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  on(const char *)
1a770 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c  ;../*.** Control
1a780 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68   and query of th
1a790 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  e open file hand
1a7a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1a7b0 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c  t winFileControl
1a7c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a7d0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
1a7e0 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c  *pArg){.  winFil
1a7f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
1a800 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41  ile*)id;.  OSTRA
1a810 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a820 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d  %p, op=%d, pArg=
1a830 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
1a840 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73   op, pArg));.  s
1a850 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1a860 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1a870 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1a880 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1a890 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
1a8a0 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ype;.      OSTRA
1a8b0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a8c0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1a8d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1a8e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a8f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a900 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1a910 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  CNTL_LAST_ERRNO:
1a920 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1a930 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c  pArg = (int)pFil
1a940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1a950 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1a960 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1a970 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1a980 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1a990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a9b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1a9c0 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1a9d0 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1a9e0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1a9f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1aa00 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1aa10 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1aa20 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1aa30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1aa40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1aa50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1aa60 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
1aa70 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
1aa80 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1aa90 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1aaa0 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20  4 oldSz;.       
1aab0 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c   int rc = winFil
1aac0 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a  eSize(id, &oldSz
1aad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1aae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1aaf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ab00 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20  3_int64 newSz = 
1ab10 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
1ab20 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  )pArg;.         
1ab30 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a   if( newSz>oldSz
1ab40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ab50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1ab60 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1ab70 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1ab80 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a  uncate(id, newSz
1ab90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
1aba0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1abb0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20  nign(0);.       
1abc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1abd0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1abe0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1abf0 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
1ac00 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
1ac10 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1ac20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ac30 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1ac40 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1ac50 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1ac60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1ac70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ac80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ac90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1aca0 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
1acb0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 50  : {.      int bP
1acc0 65 72 73 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29  ersist = *(int*)
1acd0 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  pArg;.      if( 
1ace0 62 50 65 72 73 69 73 74 3c 30 20 29 7b 0a 20 20  bPersist<0 ){.  
1acf0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1ad00 67 20 3d 20 70 46 69 6c 65 2d 3e 62 50 65 72 73  g = pFile->bPers
1ad10 69 73 74 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65  istWal;.      }e
1ad20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
1ad30 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c 20  le->bPersistWal 
1ad40 3d 20 62 50 65 72 73 69 73 74 21 3d 30 3b 0a 20  = bPersist!=0;. 
1ad50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ad60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ad70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1ad80 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
1ad90 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
1ada0 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
1adb0 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
1adc0 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
1add0 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
1ade0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1adf0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1ae00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1ae10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ae20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1ae30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1ae40 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
1ae50 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
1ae60 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
1ae70 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
1ae80 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1ae90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1aea0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1aeb0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1aec0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1aed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1aee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1aef0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1af00 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1af10 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1af20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1af30 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1af40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1af50 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1af60 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1af70 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
1af80 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
1af90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1afa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1afb0 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
1afc0 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20  AV_RETRY: {.    
1afd0 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a    int *a = (int*
1afe0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
1aff0 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[0]>0 ){.     
1b000 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
1b010 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
1b020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
1b030 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74  0] = winIoerrRet
1b040 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ry;.      }.    
1b050 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a    if( a[1]>0 ){.
1b060 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
1b070 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31  RetryDelay = a[1
1b080 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
1b090 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77          a[1] = w
1b0a0 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
1b0b0 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
1b0c0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b0d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1b0e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1b0f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1b100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b110 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1b120 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65  TE_TEST.    case
1b130 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
1b140 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20  N32_SET_HANDLE: 
1b150 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45  {.      LPHANDLE
1b160 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e   phFile = (LPHAN
1b170 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20  DLE)pArg;.      
1b180 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20  HANDLE hOldFile 
1b190 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
1b1a0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68    pFile->h = *ph
1b1b0 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46  File;.      *phF
1b1c0 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a  ile = hOldFile;.
1b1d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b1e0 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70  FCNTL oldFile=%p
1b1f0 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63  , newFile=%p, rc
1b200 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4f                hO
1b220 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  ldFile, pFile->h
1b230 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1b240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b250 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1b260 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1b270 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1b280 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1b290 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
1b2a0 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
1b2b0 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
1b2c0 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
1b2d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b2e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
1b2f0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
1b300 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
1b310 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b320 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b330 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
1b340 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1b350 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1b360 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
1b370 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1b380 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1b390 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b3a0 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1b3b0 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1b3c0 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1b3d0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1b3e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1b3f0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1b400 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b410 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1b420 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1b430 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b440 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1b450 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
1b460 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
1b470 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
1b480 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
1b490 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
1b4a0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
1b4b0 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
1b4c0 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
1b4d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1b4e0 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
1b4f0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
1b500 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
1b510 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e  .          winUn
1b520 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
1b530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1b540 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  inMapfile(pFile,
1b550 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
1b560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1b570 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1b580 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1b590 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
1b5a0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1b5b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1b5c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1b5d0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46   }.  OSTRACE(("F
1b5e0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b5f0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
1b600 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1b610 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b620 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1b630 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1b640 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1b650 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1b660 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1b670 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1b680 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1b690 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1b6a0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1b6b0 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1b6c0 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1b6d0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1b6e0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1b6f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1b700 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1b710 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1b720 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1b730 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1b740 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1b750 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1b760 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1b770 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1b780 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1b790 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1b7a0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1b7b0 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1b7c0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
1b7d0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1b7e0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
1b7f0 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
1b800 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1b810 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
1b820 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
1b830 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
1b840 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
1b850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1b860 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1b870 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
1b880 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
1b890 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
1b8a0 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
1b8b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
1b8c0 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
1b8d0 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
1b8e0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
1b8f0 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
1b900 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1b910 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
1b920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .}../*.** Window
1b930 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20  s will only let 
1b940 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20  you create file 
1b950 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a  view mappings.**
1b960 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73   on allocation s
1b970 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ize granularity 
1b980 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44  boundaries..** D
1b990 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73  uring sqlite3_os
1b9a0 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20  _init() we do a 
1b9b0 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a  GetSystemInfo().
1b9c0 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72  ** to get the gr
1b9d0 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a  anularity size..
1b9e0 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45 4d  */.static SYSTEM
1b9f0 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f  _INFO winSysInfo
1ba00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1ba10 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a  E_OMIT_WAL../*.*
1ba20 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
1ba30 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
1ba40 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
1ba50 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
1ba60 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
1ba70 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
1ba80 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b  tect the winLock
1ba90 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65  Info objects use
1baa0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c  d by.** this fil
1bab0 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
1bac0 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79  may be shared by
1bad0 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1bae0 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
1baf0 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  n winShmMutexHel
1bb00 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
1bb10 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
1bb20 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a   global mutex.**
1bb30 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
1bb40 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
1bb50 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
1bb60 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
1bb70 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
1bb80 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
1bb90 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
1bba0 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
1bbb0 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
1bbc0 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
1bbd0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1bbe0 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
1bbf0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1bc00 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
1bc10 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1bc20 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1bc30 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1bc40 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 73  ATIC_VFS1));.}.s
1bc50 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1bc60 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
1bc70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
1bc80 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
1bc90 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
1bca0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56  E_MUTEX_STATIC_V
1bcb0 46 53 31 29 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  FS1));.}.#ifndef
1bcc0 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
1bcd0 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  nt winShmMutexHe
1bce0 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74  ld(void) {.  ret
1bcf0 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
1bd00 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75  x_held(sqlite3Mu
1bd10 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1bd20 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53  MUTEX_STATIC_VFS
1bd30 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  1));.}.#endif../
1bd40 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
1bd50 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
1bd60 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
1bd70 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
1bd80 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
1bd90 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
1bda0 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
1bdb0 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
1bdc0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
1bdd0 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
1bde0 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
1bdf0 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
1be00 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
1be10 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
1be20 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
1be30 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
1be40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
1be50 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
1be60 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
1be70 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
1be80 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
1be90 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1bea0 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
1beb0 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
1bec0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
1bed0 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
1bee0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1bef0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1bf00 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
1bf10 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
1bf20 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  xt.**.** The fol
1bf30 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
1bf40 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
1bf50 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
1bf60 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
1bf70 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
1bf80 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
1bf90 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64  Either winShmNod
1bfa0 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
1bfb0 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f  held or winShmNo
1bfc0 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
1bfd0 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
1bfe0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
1bff0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1c000 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
1c010 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
1c020 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a  tructure..**.*/.
1c030 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1c040 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e {.  sqlite3_mu
1c050 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
1c060 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
1c070 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
1c080 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
1c090 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1c0a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1c0b0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ile */.  winFile
1c0c0 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20   hFile;         
1c0d0 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
1c0e0 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20  le from winOpen 
1c0f0 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69  */..  int szRegi
1c100 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1c110 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
1c120 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1c130 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69  s */.  int nRegi
1c140 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1c150 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
1c160 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
1c170 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
1c180 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68  n {.    HANDLE h
1c190 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
1c1a0 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
1c1b0 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d  from CreateFileM
1c1c0 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f  apping */.    vo
1c1d0 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61  id *pMap;.  } *a
1c1e0 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  Region;.  DWORD 
1c1f0 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
1c200 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
1c210 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
1c220 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
1c230 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66  r */..  int nRef
1c240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c250 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c260 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
1c270 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1c280 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69  */.  winShm *pFi
1c290 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
1c2a0 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62  /* All winShm ob
1c2b0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1c2c0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
1c2d0 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20  hmNode *pNext;  
1c2e0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
1c2f0 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69  n list of all wi
1c300 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
1c310 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1c320 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1c330 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c340 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20  HAVE_OS_TRACE). 
1c350 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
1c360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c370 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69  ext available wi
1c380 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  nShm.id value */
1c390 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
1c3a0 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79  * A global array
1c3b0 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
1c3c0 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a  de objects..**.*
1c3d0 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65  * The winShmMute
1c3e0 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
1c3f0 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69  true while readi
1c400 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1c410 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  is list..*/.stat
1c420 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77  ic winShmNode *w
1c430 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
1c440 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  0;../*.** Struct
1c450 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
1c460 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
1c470 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
1c480 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
1c490 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1c4a0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1c4b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1c4c0 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
1c4d0 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
1c4e0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1c4f0 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
1c500 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
1c510 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e  er:.**.**    win
1c520 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20  Shm.pShmNode.** 
1c530 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a     winShm.id.**.
1c540 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
1c550 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
1c560 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e  te.  The winShm.
1c570 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1c580 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
1c590 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
1c5a0 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
1c5b0 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
1c5c0 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53   winShm {.  winS
1c5d0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1c5e0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  ;      /* The un
1c5f0 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e  derlying winShmN
1c600 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
1c610 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  winShm *pNext;  
1c620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1c630 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74  xt winShm with t
1c640 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f  he same winShmNo
1c650 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
1c660 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
1c670 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
1c680 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d  lding the winShm
1c690 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
1c6a0 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
1c6b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c6c0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1c6d0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
1c6e0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
1c6f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1c700 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1c710 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 20 64  ks held */.#if d
1c720 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1c730 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1c740 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
1c750 52 41 43 45 29 0a 20 20 75 38 20 69 64 3b 20 20  RACE).  u8 id;  
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1c780 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1c790 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20   its winShmNode 
1c7a0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1c7b0 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
1c7c0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
1c7d0 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
1c7e0 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
1c7f0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
1c800 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  4)        /* fir
1c810 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
1c820 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
1c830 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f  DMS    (WIN_SHM_
1c840 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
1c850 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
1c860 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
1c870 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f  .** Apply adviso
1c880 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
1c890 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69   n bytes beginni
1c8a0 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23  ng at ofst..*/.#
1c8b0 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f 55 4e  define WINSHM_UN
1c8c0 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 57  LCK  1.#define W
1c8d0 49 4e 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23  INSHM_RDLCK  2.#
1c8e0 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f 57 52  define WINSHM_WR
1c8f0 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e  LCK  3.static in
1c900 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  t winShmSystemLo
1c910 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ck(.  winShmNode
1c920 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41   *pFile,    /* A
1c930 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
1c940 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
1c950 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
1c960 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
1c970 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 4e 53           /* WINS
1c980 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 53 48 4d  HM_UNLCK, WINSHM
1c990 5f 52 44 4c 43 4b 2c 20 6f 72 20 57 49 4e 53 48  _RDLCK, or WINSH
1c9a0 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  M_WRLCK */.  int
1c9b0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
1c9c0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
1c9d0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  first byte to be
1c9e0 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64   locked/unlocked
1c9f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ca10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1ca20 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
1ca30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1ca40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1ca50 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
1ca60 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69  rm Lock/UnlockFi
1ca70 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  leEx() */..  /* 
1ca80 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69  Access to the wi
1ca90 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
1caa0 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
1cab0 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
1cac0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1cad0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
1cae0 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69  e->mutex) || pFi
1caf0 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
1cb00 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1cb10 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
1cb20 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64  ck=%d, offset=%d
1cb30 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20  , size=%d\n",.  
1cb40 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1cb50 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70  hFile.h, lockTyp
1cb60 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29  e, ofst, nByte))
1cb70 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f  ;..  /* Release/
1cb80 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
1cb90 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
1cba0 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  .  if( lockType=
1cbb0 3d 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  =WINSHM_UNLCK ){
1cbc0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c  .    rc = winUnl
1cbd0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
1cbe0 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30  hFile.h, ofst, 0
1cbf0 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
1cc00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
1cc10 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
1cc20 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1cc30 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c  /.    DWORD dwFl
1cc40 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46  ags = LOCKFILE_F
1cc50 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b  AIL_IMMEDIATELY;
1cc60 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1cc70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 57 52 4c 43  e == WINSHM_WRLC
1cc80 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
1cc90 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
1cca0 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  E_LOCK;.    rc =
1ccb0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
1ccc0 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77  ile->hFile.h, dw
1ccd0 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20  Flags, ofst, 0, 
1cce0 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  nByte, 0);.  }..
1ccf0 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
1cd00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cd10 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1cd20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1cd30 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
1cd40 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
1cd50 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1cd60 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
1cd70 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
1cd80 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25  func=%s, errno=%
1cd90 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  lu, rc=%s\n",.  
1cda0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1cdb0 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79  hFile.h, (lockTy
1cdc0 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 55 4e 4c  pe == WINSHM_UNL
1cdd0 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b  CK) ? "winUnlock
1cde0 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20  File" :.        
1cdf0 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22     "winLockFile"
1ce00 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1ce10 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  no, sqlite3ErrNa
1ce20 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74  me(rc)));..  ret
1ce30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1ce40 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1ce50 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
1ce60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1ce70 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
1ce80 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
1ce90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1cea0 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
1ceb0 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
1cec0 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
1ced0 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
1cee0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
1cef0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
1cf00 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
1cf10 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
1cf20 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
1cf30 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
1cf40 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1cf50 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
1cf60 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
1cf70 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
1cf80 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1cf90 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
1cfa0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
1cfb0 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
1cfc0 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
1cfd0 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
1cfe0 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
1cff0 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73  ShmNode *p;.  as
1d000 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
1d010 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54  xHeld() );.  OST
1d020 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1d030 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65   pid=%lu, delete
1d040 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Flag=%d\n",.    
1d050 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1d060 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1d070 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20  deleteFlag));.  
1d080 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
1d090 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
1d0a0 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
1d0b0 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
1d0c0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1d0d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
1d0e0 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f  utex ){ sqlite3_
1d0f0 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1d100 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f  tex); }.      fo
1d110 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
1d120 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
1d130 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73     BOOL bRc = os
1d140 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1d150 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
1d160 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
1d170 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1d180 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  -UNMAP pid=%lu, 
1d190 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
1d1a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d1b0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1d1c0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
1d1d0 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
1d1e0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1d1f0 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42     UNUSED_VARIAB
1d200 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20  LE_VALUE(bRc);. 
1d210 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43         bRc = osC
1d220 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52  loseHandle(p->aR
1d230 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a  egion[i].hMap);.
1d240 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1d250 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53  ("SHM-PURGE-CLOS
1d260 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1d270 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d290 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1d2a0 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1d2b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1d2c0 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1d2d0 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1d2e0 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1d2f0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
1d300 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
1d310 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
1d320 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1d330 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1d340 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1d350 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
1d360 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
1d370 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
1d380 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
1d390 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1d3a0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
1d3b0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
1d3c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
1d3d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1d3e0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
1d3f0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
1d400 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
1d410 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
1d420 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
1d430 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1d440 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1d450 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
1d460 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1d470 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
1d480 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
1d490 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
1d4a0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
1d4b0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
1d4c0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1d4d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1d4e0 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
1d4f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1d500 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
1d510 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
1d520 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1d530 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
1d540 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
1d550 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1d560 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1d570 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1d580 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1d590 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1d5a0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1d5b0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1d5c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1d5d0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1d5e0 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1d5f0 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1d600 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1d610 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1d620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1d630 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1d640 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
1d650 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
1d660 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1d670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1d680 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
1d690 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
1d6a0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
1d6b0 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
1d6c0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1d6d0 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1d6e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1d710 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
1d720 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
1d730 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1d740 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
1d750 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
1d760 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d780 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
1d790 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
1d7a0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1d7b0 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
1d7c0 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
1d7d0 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
1d7e0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1d7f0 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
1d800 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
1d810 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
1d820 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
1d830 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
1d840 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
1d850 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
1d860 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
1d870 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
1d880 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
1d890 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1d8a0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
1d8b0 50 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71  PT;.  nName = sq
1d8c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
1d8d0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70  bFd->zPath);.  p
1d8e0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  New = sqlite3Mal
1d8f0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
1d900 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61  *pShmNode) + nNa
1d910 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28  me + 17 );.  if(
1d920 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1d930 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1d940 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d950 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
1d960 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  KPT;.  }.  pNew-
1d970 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
1d980 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
1d990 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1d9a0 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
1d9b0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
1d9c0 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1d9d0 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
1d9e0 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
1d9f0 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
1da00 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  ilename);..  /* 
1da10 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74  Look to see if t
1da20 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74  here is an exist
1da30 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74  ing winShmNode t
1da40 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e  hat can be used.
1da50 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  ** If no matc
1da60 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  hing winShmNode 
1da70 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
1da80 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
1da90 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68  ne..  */.  winSh
1daa0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
1dab0 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20   for(pShmNode = 
1dac0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20  winShmNodeList; 
1dad0 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f  pShmNode; pShmNo
1dae0 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65  de=pShmNode->pNe
1daf0 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20  xt){.    /* TBD 
1db00 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20  need to come up 
1db10 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63  with better matc
1db20 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73  h here.  Perhaps
1db30 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45  .    ** use FILE
1db40 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46  _ID_BOTH_DIR_INF
1db50 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20  O Structure..   
1db60 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1db70 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e  te3StrICmp(pShmN
1db80 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1db90 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
1dba0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
1dbb0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20  .  if( pShmNode 
1dbc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1dbd0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c  ree(pNew);.  }el
1dbe0 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  se{.    pShmNode
1dbf0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
1dc00 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e  w = 0;.    ((win
1dc10 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65  File*)(&pShmNode
1dc20 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49  ->hFile))->h = I
1dc30 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1dc40 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  LUE;.    pShmNod
1dc50 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68  e->pNext = winSh
1dc60 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  mNodeList;.    w
1dc70 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
1dc80 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 69  pShmNode;..    i
1dc90 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1dca0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
1dcb0 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e  x ){.      pShmN
1dcc0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
1dcd0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1dce0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
1dcf0 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
1dd00 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
1dd10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1dd20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
1dd30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1dd40 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1dd50 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
1dd60 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69    }..    rc = wi
1dd70 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66  nOpen(pDbFd->pVf
1dd80 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1dd90 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
1dda0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
1ddb0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ddc0 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
1ddd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1dde0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
1ddf0 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
1de00 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68  File,  /* File h
1de10 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1de30 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
1de40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1de50 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1de60 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20  OPEN_CREATE,.   
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
1de80 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
1de90 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20  _OK!=rc ){.     
1dea0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1deb0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rr;.    }..    /
1dec0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ded0 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
1dee0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
1def0 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
1df00 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  ..    ** If not,
1df10 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1df20 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1df30 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  h..    */.    if
1df40 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
1df50 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
1df60 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_WRLCK, WIN_S
1df70 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
1df80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1df90 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
1dfa0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1dfb0 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1dfc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1dfd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dfe0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1dff0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1e000 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
1e010 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1e020 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e030 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f             "winO
1e040 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e  penShm", pDbFd->
1e050 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
1e060 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1e070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e080 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65       winShmSyste
1e090 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1e0a0 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  WINSHM_UNLCK, WI
1e0b0 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1e0c0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1e0d0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1e0e0 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43  ode, WINSHM_RDLC
1e0f0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1e100 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1e110 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
1e120 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
1e130 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
1e140 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
1e150 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ild of the winSh
1e160 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
1e170 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
1e180 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
1e190 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1e1a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
1e1b0 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20  AVE_OS_TRACE).  
1e1c0 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
1e1d0 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
1e1e0 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
1e1f0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
1e200 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77  d->pShm = p;.  w
1e210 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1e220 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
1e230 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
1e240 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
1e250 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
1e260 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
1e270 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
1e280 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  e winShmEnterMut
1e290 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
1e2a0 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
1e2b0 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
1e2c0 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a  ruct winShm) obj
1e2d0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
1e2e0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
1e2f0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
1e300 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
1e310 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
1e320 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
1e330 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
1e340 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
1e350 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
1e360 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
1e370 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
1e380 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
1e390 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  tex.  ** mutex..
1e3a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1e3b0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1e3c0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
1e3d0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
1e3e0 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
1e3f0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
1e400 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
1e410 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1e420 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
1e430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e440 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1e450 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
1e460 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
1e470 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1e480 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48  (pShmNode, WINSH
1e490 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
1e4a0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53  _DMS, 1);.  winS
1e4b0 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
1e4c0 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a  Vfs, 0);      /*
1e4d0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
1e4e0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
1e4f0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
1e500 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71  e3_free(p);.  sq
1e510 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1e520 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1e530 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
1e540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
1e550 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
1e560 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
1e570 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
1e580 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f  nderlying.** sto
1e590 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
1e5a0 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ag is true..*/.s
1e5b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1e5c0 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
1e5d0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1e5e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e5f0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1e600 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64  emory */.  int d
1e610 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
1e620 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
1e630 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66  after closing if
1e640 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69   true */.){.  wi
1e650 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  nFile *pDbFd;   
1e660 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e670 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d  holding shared-m
1e680 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1e690 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1e6a0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1e6b0 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
1e6c0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1e6d0 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68  *pShmNode; /* Th
1e6e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
1e6f0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1e700 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70  */.  winShm **pp
1e710 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
1e720 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
1e730 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1e740 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  ns */..  pDbFd =
1e750 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
1e760 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
1e770 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1e780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e790 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1e7a0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a  >pShmNode;..  /*
1e7b0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
1e7c0 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
1e7d0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
1e7e0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
1e7f0 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
1e800 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1e810 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1e820 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
1e830 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
1e840 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
1e850 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
1e860 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
1e870 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
1e880 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
1e890 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
1e8a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
1e8b0 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
1e8c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e8d0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1e8e0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
1e8f0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
1e900 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
1e910 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
1e920 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
1e930 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
1e940 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  oo */.  winShmEn
1e950 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
1e960 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
1e970 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
1e980 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
1e990 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1e9a0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  ef==0 ){.    win
1e9b0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
1e9c0 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67  pVfs, deleteFlag
1e9d0 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c  );.  }.  winShmL
1e9e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
1e9f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ea00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
1ea10 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
1ea20 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
1ea30 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f  mory segment..*/
1ea40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1ea50 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
1ea60 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1ea70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1ea80 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
1ea90 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1eaa0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
1ead0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
1eae0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1eb10 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
1eb20 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1eb30 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb50 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
1eb60 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
1eb70 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
1eb80 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1eb90 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1eba0 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
1ebb0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1ebc0 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
1ebd0 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
1ebe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
1ebf0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
1ec00 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e   locked */.  win
1ec10 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1ec40 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
1ec50 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  ngs */.  winShmN
1ec60 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1ec70 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  p->pShmNode;.  i
1ec80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ec90 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
1eca0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1ecb0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
1ecc0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ece0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1ecf0 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
1ed00 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
1ed10 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
1ed20 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
1ed30 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
1ed40 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
1ed50 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
1ed60 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1ed70 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1ed80 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1ed90 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
1eda0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1edb0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
1edc0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1edd0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
1ede0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1edf0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1ee00 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1ee10 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1ee20 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
1ee30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
1ee40 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
1ee50 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1ee60 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  VE)!=0 );..  mas
1ee70 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28  k = (u16)((1U<<(
1ee80 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c  ofst+n)) - (1U<<
1ee90 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74  ofst));.  assert
1eea0 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
1eeb0 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
1eec0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1eed0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1eee0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
1eef0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
1ef00 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
1ef10 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
1ef20 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
1ef30 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
1ef40 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
1ef50 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
1ef60 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
1ef70 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1ef80 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1ef90 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1efa0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
1efb0 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
1efc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1efd0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
1efe0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
1eff0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
1f000 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
1f010 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1f020 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1f030 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
1f040 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
1f050 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
1f060 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
1f070 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1f080 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1f090 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c  Node, WINSHM_UNL
1f0a0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
1f0b0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
1f0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f0d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f0e0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
1f0f0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
1f100 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1f110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f120 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
1f130 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
1f140 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1f150 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1f160 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
1f170 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
1f180 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
1f190 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
1f1a0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
1f1b0 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
1f1c0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
1f1d0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
1f1e0 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
1f1f0 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
1f200 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
1f210 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
1f220 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
1f230 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
1f240 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
1f250 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
1f260 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
1f270 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
1f280 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1f290 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1f2a0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1f2b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1f2c0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1f2d0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1f2e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f2f0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
1f300 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1f310 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
1f320 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1f330 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1f340 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
1f350 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1f360 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
1f370 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
1f380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f390 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
1f3a0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
1f3b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1f3c0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1f3d0 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f  ShmNode, WINSHM_
1f3e0 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  RDLCK, ofst+WIN_
1f3f0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1f400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f410 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1f420 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
1f430 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
1f440 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
1f450 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
1f460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f470 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1f480 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1f490 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1f4a0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
1f4b0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1f4c0 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
1f4d0 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
1f4e0 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
1f4f0 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
1f500 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
1f510 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
1f520 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1f530 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1f540 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1f550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1f560 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1f570 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
1f580 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
1f590 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1f5a0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1f5b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1f5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f5d0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
1f5e0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
1f5f0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
1f600 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
1f610 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
1f620 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
1f630 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
1f640 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
1f650 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1f660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f670 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1f680 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1f690 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b  de, WINSHM_WRLCK
1f6a0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1f6b0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
1f6c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1f6e0 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
1f6f0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
1f700 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
1f710 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1f720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f730 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f740 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1f750 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
1f760 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64  E(("SHM-LOCK pid
1f770 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61  =%lu, id=%d, sha
1f780 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78  redMask=%03x, ex
1f790 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d  clMask=%03x, rc=
1f7a0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1f7b0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1f7c0 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64  ocessId(), p->id
1f7d0 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
1f7e0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
1f7f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f800 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1f810 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f820 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
1f830 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
1f840 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
1f850 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1f860 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64  ..**.** All load
1f870 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
1f880 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
1f890 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
1f8a0 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
1f8b0 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
1f8c0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
1f8d0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
1f8e0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
1f8f0 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
1f900 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
1f910 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1f920 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1f930 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1f940 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f950 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  R(fd);.  sqlite3
1f960 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
1f970 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64     /* compiler-d
1f980 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61  efined memory ba
1f990 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
1f9a0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20  mEnterMutex();  
1f9b0 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74       /* Also mut
1f9c0 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e  ex, for redundan
1f9d0 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65  cy */.  winShmLe
1f9e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
1f9f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1fa00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1fa10 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
1fa20 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
1fa30 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61  on of the.** sha
1fa40 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1fa50 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1fa60 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1fa70 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1fa80 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75  egions.** are nu
1fa90 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
1faa0 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
1fab0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1fac0 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
1fad0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1fae0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
1faf0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
1fb00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1fb10 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
1fb20 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1fb30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1fb40 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70  if the isWrite p
1fb50 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
1fb60 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1fb70 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
1fb80 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1fb90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1fba0 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
1fbb0 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
1fbc0 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
1fbd0 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
1fbe0 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
1fbf0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
1fc00 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1fc10 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  If.** isWrite is
1fc20 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
1fc30 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1fc40 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1fc50 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20   has not yet.** 
1fc60 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1fc70 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1fc80 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1fc90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1fca0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1fcb0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1fcc0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1fcd0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1fce0 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1fcf0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1fd00 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1fd10 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1fd20 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64 72  rocesses.** addr
1fd30 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
1fd40 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
1fd50 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
1fd60 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
1fd70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ped.** memory an
1fd80 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1fd90 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1fda0 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
1fdb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1fdc0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1fdd0 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
1fde0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
1fdf0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
1fe00 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1fe10 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
1fe20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
1fe30 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
1fe60 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
1fe70 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
1fe80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1fe90 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
1fea0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1feb0 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1fec0 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
1fed0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
1fee0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
1fef0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
1ff00 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
1ff10 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20   winShm *pShm = 
1ff20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
1ff30 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1ff40 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1ff50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1ff60 28 20 21 70 53 68 6d 20 29 7b 0a 20 20 20 20 72  ( !pShm ){.    r
1ff70 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
1ff80 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
1ff90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ffa0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1ffb0 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20 70 44  c;.    pShm = pD
1ffc0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
1ffd0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d   pShmNode = pShm
1ffe0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
1fff0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
20000 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
20010 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
20020 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
20030 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
20040 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
20050 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
20060 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
20070 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
20080 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
20090 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
200a0 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
200b0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
200c0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
200d0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
200e0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
200f0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
20100 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
20110 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
20120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
20130 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
20140 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
20150 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
20160 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
20170 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
20180 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
20190 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
201a0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
201b0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
201c0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
201d0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
201e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
201f0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
20200 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
20210 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
20220 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
20230 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
20240 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
20250 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
20260 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
20270 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
20280 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
20290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
202a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
202b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
202c0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
202d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
202e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
202f0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
20300 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap1", pDbFd->zPa
20310 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  th);.      goto 
20320 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
20330 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e   }..    if( sz<n
20340 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Byte ){.      /*
20350 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
20360 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
20370 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
20380 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74  isWrite is set t
20390 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c  o.      ** zero,
203a0 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
203b0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
203c0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
203d0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
203e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
203f0 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
20400 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
20410 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63  zero, use ftrunc
20420 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
20430 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
20440 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
20450 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  region..      */
20460 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72  .      if( !isWr
20470 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  ite ) goto shmpa
20480 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63  ge_out;.      rc
20490 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
204a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
204b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
204c0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
204d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
204e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
204f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
20500 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
20510 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
20520 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
20540 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
20550 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
20560 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
20570 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
20580 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
20590 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
205a0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
205b0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
205c0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
205d0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
205e0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
205f0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
20600 36 34 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  64(.        pShm
20610 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28  Node->aRegion, (
20620 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
20630 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20  f(apNew[0]).    
20640 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
20650 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
20660 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
20670 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
20680 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
20690 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
206a0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
206b0 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
206c0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
206d0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
206e0 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
206f0 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
20700 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
20710 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
20720 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
20730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20740 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
20750 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53 51  egion */..#if SQ
20760 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
20770 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
20780 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
20790 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  omApp(pShmNode->
207a0 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
207b0 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
207c0 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20  ADWRITE, nByte, 
207d0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
207e0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
207f0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
20800 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  E).      hMap = 
20810 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
20820 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingW(pShmNode->h
20830 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
20840 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
20850 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
20860 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
20870 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
20880 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
20890 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57  NSI) && SQLITE_W
208a0 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d  IN32_CREATEFILEM
208b0 41 50 50 49 4e 47 41 0a 20 20 20 20 20 20 68 4d  APPINGA.      hM
208c0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
208d0 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f  eMappingA(pShmNo
208e0 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
208f0 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
20900 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
20910 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
20920 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
20930 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
20940 4d 41 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25  MAP-CREATE pid=%
20950 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73  lu, region=%d, s
20960 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ize=%d, rc=%s\n"
20970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20980 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
20990 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
209a0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79  de->nRegion, nBy
209b0 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
209c0 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     hMap ? "ok" :
209d0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
209e0 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
209f0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
20a00 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  et = pShmNode->n
20a10 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
20a20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
20a30 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
20a40 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
20a50 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
20a60 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51  nularity;.#if SQ
20a70 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
20a80 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
20a90 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
20aa0 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  App(hMap, FILE_M
20ab0 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
20ac0 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
20ad0 20 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20        iOffset - 
20ae0 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
20af0 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
20b00 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
20b10 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70  .#else.        p
20b20 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  Map = osMapViewO
20b30 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45  fFile(hMap, FILE
20b40 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
20b50 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
20b60 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73          0, iOffs
20b70 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
20b80 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
20b90 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
20ba0 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20     );.#endif.   
20bb0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
20bc0 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25  HM-MAP-MAP pid=%
20bd0 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f  lu, region=%d, o
20be0 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
20bf0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
20c10 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20c20 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
20c30 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
20c40 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
20c50 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d      szRegion, pM
20c60 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
20c70 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
20c80 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
20c90 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
20ca0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
20cb0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
20cc0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
20cd0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
20ce0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
20cf0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
20d00 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20d20 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62  winShmMap3", pDb
20d30 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
20d40 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f      if( hMap ) o
20d50 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61  sCloseHandle(hMa
20d60 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  p);.        goto
20d70 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
20d80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68      }..      pSh
20d90 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
20da0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
20db0 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20  ].pMap = pMap;. 
20dc0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
20dd0 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
20de0 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d  >nRegion].hMap =
20df0 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   hMap;.      pSh
20e00 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
20e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
20e20 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
20e30 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20e40 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
20e50 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69   int iOffset = i
20e60 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
20e70 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
20e80 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
20e90 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
20ea0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
20eb0 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a  rity;.    char *
20ec0 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d  p = (char *)pShm
20ed0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52  Node->aRegion[iR
20ee0 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20  egion].pMap;.   
20ef0 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26   *pp = (void *)&
20f00 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b  p[iOffsetShift];
20f10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
20f20 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  p = 0;.  }.  sql
20f30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
20f40 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20f60 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  }..#else.# defin
20f70 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20  e winShmMap     
20f80 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
20f90 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
20fa0 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65  ine winShmBarrie
20fb0 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  r 0.# define win
20fc0 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
20fd0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
20fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
20ff0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20  /../*.** Cleans 
21000 75 70 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  up the mapped re
21010 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63  gion of the spec
21020 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61  ified file, if a
21030 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ny..*/.#if SQLIT
21040 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
21050 30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  0.static int win
21060 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
21070 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
21080 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
21090 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d  .  OSTRACE(("UNM
210a0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
210b0 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
210c0 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25  %p, pMapRegion=%
210d0 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  p, ".           
210e0 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20  "mmapSize=%lld, 
210f0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25  mmapSizeActual=%
21100 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78  lld, mmapSizeMax
21110 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
21120 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21130 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
21140 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70  ile, pFile->hMap
21150 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
21160 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
21170 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c  pFile->mmapSize,
21180 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
21190 41 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d  Actual, pFile->m
211a0 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20  mapSizeMax));.  
211b0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
211c0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  egion ){.    if(
211d0 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46   !osUnmapViewOfF
211e0 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ile(pFile->pMapR
211f0 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  egion) ){.      
21200 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
21210 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
21220 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
21230 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
21240 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
21250 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
21260 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
21270 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f     "rc=SQLITE_IO
21280 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47  ERR_MMAP\n", osG
21290 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
212a0 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20  Id(), pFile,.   
212b0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
212c0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b  e->pMapRegion));
212d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
212e0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
212f0 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
21300 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61          "winUnma
21330 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e  pfile1", pFile->
21340 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
21350 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
21360 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ion = 0;.    pFi
21370 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
21380 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
21390 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
213a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
213b0 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap!=NULL ){.
213c0 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65      if( !osClose
213d0 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
213e0 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ap) ){.      pFi
213f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
21400 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21410 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21420 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
21430 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
21440 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49  hMap=%p, rc=SQLI
21450 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
21460 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21470 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
21480 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
21490 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a   pFile->hMap));.
214a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
214b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
214c0 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c  IOERR_MMAP, pFil
214d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70         "winUnmap
21500 66 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  file2", pFile->z
21510 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
21520 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
21530 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ULL;.  }.  OSTRA
21540 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
21550 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
21560 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
21570 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
21580 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
21590 73 73 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b  ssId(), pFile));
215a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
215b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  _OK;.}../*.** Me
215c0 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
215d0 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
215e0 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
215f0 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
21600 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
21610 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
21620 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
21630 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
21640 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
21650 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
21660 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
21670 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
21680 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
21690 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e  still.** outstan
216a0 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65  ding xFetch() re
216b0 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20  ferences to it, 
216c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
216d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
216e0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79  If parameter nBy
216f0 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  te is non-negati
21700 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ve, then it is t
21710 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
21720 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70  e of.** the mapp
21730 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
21740 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
21750 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
21760 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
21770 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
21780 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
21790 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
217a0 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
217b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
217c0 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
217d0 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
217e0 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
217f0 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
21800 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
21810 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
21820 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
21830 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
21840 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21850 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
21860 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
21870 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
21880 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
21890 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
218a0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
218b0 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
218c0 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
218d0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
218e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
218f0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
21900 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
21910 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
21920 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
21930 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
21940 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
21950 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
21960 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
21970 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
21980 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
21990 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
219a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
219b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
219c0 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
219d0 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
219e0 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
219f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21a00 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
21a10 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
21a20 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
21a30 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
21a40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
21a50 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21a60 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
21a70 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
21a80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
21a90 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
21aa0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
21ab0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
21ac0 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
21ad0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
21ae0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
21af0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
21b00 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
21b10 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
21b20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
21b30 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
21b40 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
21b50 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
21b60 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e  e - 1);..  if( n
21b70 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d  Map==0 && pFd->m
21b80 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
21b90 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
21ba0 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  d);.  }.  if( nM
21bb0 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
21bc0 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  e ){.    void *p
21bd0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f  New = 0;.    DWO
21be0 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47  RD protect = PAG
21bf0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
21c00 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49  DWORD flags = FI
21c10 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20  LE_MAP_READ;..  
21c20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
21c30 46 64 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Fd);.#ifdef SQLI
21c40 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54  TE_MMAP_READWRIT
21c50 45 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e  E.    if( (pFd->
21c60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
21c70 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
21c80 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20  {.      protect 
21c90 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  = PAGE_READWRITE
21ca0 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
21cb0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b   FILE_MAP_WRITE;
21cc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
21cd0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
21ce0 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  T.    pFd->hMap 
21cf0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
21d00 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64  ppingFromApp(pFd
21d10 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
21d20 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b  ct, nMap, NULL);
21d30 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
21d40 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
21d50 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68  WIDE).    pFd->h
21d60 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
21d70 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e  leMappingW(pFd->
21d80 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
21d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21db0 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
21dc0 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
21dd0 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
21e00 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
21e10 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
21e20 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
21e30 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53  2_HAS_ANSI) && S
21e40 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41  QLITE_WIN32_CREA
21e50 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20  TEFILEMAPPINGA. 
21e60 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
21e70 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
21e80 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngA(pFd->h, NULL
21e90 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
21ec0 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
21ed0 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
21f00 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
21f10 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
21f20 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
21f30 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29  Fd->hMap==NULL )
21f40 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  {.      pFd->las
21f50 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
21f60 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
21f70 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
21f80 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
21f90 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72  MAP, pFd->lastEr
21fa0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
21fc0 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e  Mapfile1", pFd->
21fd0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a  zPath);.      /*
21fe0 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20   Log the error, 
21ff0 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72  but continue nor
22000 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73  mal operation us
22010 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
22020 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
22030 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45  E(("MAP-FILE-CRE
22040 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
22050 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
22060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22070 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22080 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
22090 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
220a0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
220b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
220c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 6e  }.    assert( (n
220d0 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  Map % winSysInfo
220e0 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  .dwPageSize)==0 
220f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
22100 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73  izeof(SIZE_T)==s
22110 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e  izeof(sqlite3_in
22120 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78  t64) || nMap<=0x
22130 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20  ffffffff );.#if 
22140 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
22150 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
22160 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
22170 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  p(pFd->hMap, fla
22180 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e  gs, 0, (SIZE_T)n
22190 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Map);.#else.    
221a0 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
221b0 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70  OfFile(pFd->hMap
221c0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28  , flags, 0, 0, (
221d0 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
221e0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65  ndif.    if( pNe
221f0 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  w==NULL ){.     
22200 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
22210 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20  Fd->hMap);.     
22220 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c   pFd->hMap = NUL
22230 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61  L;.      pFd->la
22240 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
22250 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
22260 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
22270 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22280 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
22290 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
222b0 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d  nMapfile2", pFd-
222c0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
222d0 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
222e0 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
222f0 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
22300 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
22310 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
22320 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41  CE(("MAP-FILE-MA
22330 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
22340 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
22360 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
22370 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
22380 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
22390 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
223a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
223b0 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
223c0 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ion = pNew;.    
223d0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
223e0 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  nMap;.    pFd->m
223f0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
22400 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  nMap;.  }..  OST
22410 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
22420 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
22430 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
22440 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
22450 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
22460 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
22470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22480 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
22490 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
224a0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
224b0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
224c0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
224d0 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
224e0 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
224f0 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
22500 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
22510 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
22520 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
22530 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
22540 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
22550 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
22560 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
22570 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
22580 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
22590 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
225a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
225b0 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
225c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
225d0 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
225e0 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
225f0 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
22600 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
22610 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
22620 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
22630 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
22640 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
22650 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
22660 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
22670 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
22680 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a  must eventually.
22690 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
226a0 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
226b0 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29  ing winUnfetch()
226c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
226d0 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33  winFetch(sqlite3
226e0 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
226f0 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
22700 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
22710 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
22720 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20  IZE>0.  winFile 
22730 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  *pFd = (winFile*
22740 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
22750 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
22760 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
22770 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f  .  *pp = 0;..  O
22780 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
22790 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
227a0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61  , offset=%lld, a
227b0 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c  mount=%d, pp=%p\
227c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
227d0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
227e0 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66  ssId(), fd, iOff
227f0 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23  , nAmt, pp));..#
22800 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
22810 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
22820 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
22830 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
22840 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
22850 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
22860 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
22870 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
22880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22890 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  ){.        OSTRA
228a0 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
228b0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
228c0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
228d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
228e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
228f0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
22900 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
22910 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22930 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
22940 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
22950 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
22960 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
22970 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
22980 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
22990 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
229a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
229b0 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
229c0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
229d0 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63  p=%p, *pp=%p, rc
229e0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
229f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
22a00 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
22a10 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29  ), fd, pp, *pp))
22a20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22a30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
22a40 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
22a50 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
22a60 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
22a70 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a  tion releases a.
22a80 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
22a90 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
22aa0 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46  ier call to winF
22ab0 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
22ac0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
22ad0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
22ae0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
22af0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
22b00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
22b10 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
22b20 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
22b30 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63  winFetch() invoc
22b40 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ation..**.** Or,
22b50 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
22b60 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
22b70 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
22b80 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
22b90 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  ed.** to inform 
22ba0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
22bb0 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
22bc0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
22bd0 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  ting mapping.** 
22be0 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
22bf0 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
22c00 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
22c10 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
22c20 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
22c30 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
22c40 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
22c50 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
22c60 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
22c70 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
22c80 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
22c90 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
22ca0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
22cb0 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
22cc0 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
22cd0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
22ce0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
22cf0 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
22d00 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
22d10 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
22d20 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
22d30 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
22d40 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
22d50 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
22d60 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
22d70 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
22d80 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
22d90 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
22da0 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
22db0 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
22dc0 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
22dd0 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
22de0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
22df0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
22e00 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
22e10 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
22e20 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
22e30 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
22e40 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
22e50 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
22e60 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
22e70 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
22e80 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
22e90 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
22ea0 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
22eb0 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
22ec0 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
22ed0 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
22ee0 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
22ef0 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
22f00 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
22f10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
22f20 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
22f30 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
22f40 63 65 73 73 61 72 79 20 63 61 6e 20 62 65 20 6f  cessary can be o
22f50 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69  mitted - potenti
22f60 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20  ally improving. 
22f70 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63     ** performanc
22f80 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e  e.  */.    winUn
22f90 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
22fa0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
22fb0 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
22fc0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
22fd0 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
22fe0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
22ff0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
23000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
23010 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
23020 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65  Id(), fd));.  re
23030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23040 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
23050 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
23060 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
23070 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
23080 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
23090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
230a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
230b0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
230c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
230d0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
230e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
230f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23120 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
23130 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
23140 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
23150 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
23160 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
23170 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
23180 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
23190 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
231a0 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
231b0 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20  d = {.  3,      
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
231e0 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
231f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23200 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23210 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c  se */.  winRead,
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
23240 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20   */.  winWrite, 
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23260 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
23270 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  */.  winTruncate
23280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23290 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
232a0 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20  e */.  winSync, 
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
232d0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  */.  winFileSize
232e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
232f0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
23300 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20  e */.  winLock, 
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
23330 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20  */.  winUnlock, 
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
23360 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73  */.  winCheckRes
23370 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
23380 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
23390 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
233a0 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  winFileControl, 
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233c0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
233d0 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  */.  winSectorSi
233e0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
233f0 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
23400 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69  ize */.  winDevi
23410 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
23420 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76  s,       /* xDev
23430 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
23440 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61  cs */.  winShmMa
23450 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23460 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
23470 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  ap */.  winShmLo
23480 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23490 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
234a0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42  ock */.  winShmB
234b0 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
234c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
234d0 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
234e0 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23500 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77  xShmUnmap */.  w
23510 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  inFetch,        
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23530 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69  * xFetch */.  wi
23540 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20  nUnfetch        
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23560 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a   xUnfetch */.};.
23570 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
23580 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
23590 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
235a0 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
235b0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c  n.** sqlite3_fil
235c0 65 20 66 6f 72 20 77 69 6e 33 32 20 77 69 74 68  e for win32 with
235d0 6f 75 74 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  out performing a
235e0 6e 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  ny locking..*/.s
235f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
23600 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
23610 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64  inIoNolockMethod
23620 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
23650 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
23660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23670 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23680 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
236b0 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
236e0 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
23710 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
23740 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
23770 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 4c   */.  winNolockL
23780 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23790 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
237a0 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c  /.  winNolockUnl
237b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
237c0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
237d0 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65  /.  winNolockChe
237e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
237f0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
23800 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
23810 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23830 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
23840 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
23850 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23860 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
23870 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
23880 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
23890 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
238a0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
238b0 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
238c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
238d0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
238e0 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
238f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23900 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
23910 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
23920 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
23930 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
23940 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
23950 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
23960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23970 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69  ShmUnmap */.  wi
23980 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nFetch,         
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239a0 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e   xFetch */.  win
239b0 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20  Unfetch         
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239d0 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a  xUnfetch */.};..
239e0 73 74 61 74 69 63 20 77 69 6e 56 66 73 41 70 70  static winVfsApp
239f0 44 61 74 61 20 77 69 6e 41 70 70 44 61 74 61 20  Data winAppData 
23a00 3d 20 7b 0a 20 20 26 77 69 6e 49 6f 4d 65 74 68  = {.  &winIoMeth
23a10 6f 64 2c 20 20 20 20 20 20 20 2f 2a 20 70 4d 65  od,       /* pMe
23a20 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20  thod */.  0,    
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a40 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 30   pAppData */.  0
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f     /* bNoLock */
23a70 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e 56  .};..static winV
23a80 66 73 41 70 70 44 61 74 61 20 77 69 6e 4e 6f 6c  fsAppData winNol
23a90 6f 63 6b 41 70 70 44 61 74 61 20 3d 20 7b 0a 20  ockAppData = {. 
23aa0 20 26 77 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74   &winIoNolockMet
23ab0 68 6f 64 2c 20 2f 2a 20 70 4d 65 74 68 6f 64 20  hod, /* pMethod 
23ac0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
23ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
23ae0 44 61 74 61 20 2a 2f 0a 20 20 31 20 20 20 20 20  Data */.  1     
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b00 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a   bNoLock */.};..
23b10 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
23b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
23b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
23b80 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
23b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
23bb0 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
23bc0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
23bd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
23be0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
23bf0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
23c00 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ect..*/..#if def
23c10 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
23c20 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
23c30 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77   filename from w
23c40 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65  hatever the unde
23c50 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
23c60 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f   system.** suppo
23c70 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65  rts for filename
23c80 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53  s into UTF-8.  S
23c90 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
23ca0 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62   result is.** ob
23cb0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
23cc0 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
23cd0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
23ce0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
23cf0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
23d00 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
23d10 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69  lename(const voi
23d20 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  d *zFilename){. 
23d30 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65   char *zConverte
23d40 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
23d50 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
23d60 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69  nverted = winUni
23d70 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65  codeToUtf8(zFile
23d80 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
23d90 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
23da0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
23db0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
23dc0 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a   winMbcsToUtf8(z
23dd0 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46  Filename, osAreF
23de0 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
23df0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
23e00 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
23e10 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
23e20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
23e30 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69  nverted;.}.#endi
23e40 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
23e50 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
23e60 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
23e70 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
23e80 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
23e90 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
23ea0 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
23eb0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
23ec0 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
23ed0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
23ee0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
23ef0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
23f00 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
23f10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
23f20 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
23f30 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
23f40 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
23f50 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  {.  void *zConve
23f60 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
23f70 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
23f80 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
23f90 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
23fa0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
23fb0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
23fc0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
23fd0 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
23fe0 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 4d 62 63  d = winUtf8ToMbc
23ff0 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41  s(zFilename, osA
24000 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
24010 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
24020 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
24030 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
24040 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
24050 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
24060 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24070 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
24080 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
24090 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  fied UTF-8 strin
240a0 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73  g buffer.** ends
240b0 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72   with a director
240c0 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
240d0 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73  acter or one was
240e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a   successfully.**
240f0 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f   added to it..*/
24100 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
24110 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69  akeEndInDirSep(i
24120 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
24130 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
24140 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
24150 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
24160 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66  30(zBuf);.    if
24170 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nLen>0 ){.    
24180 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65    if( winIsDirSe
24190 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20  p(zBuf[nLen-1]) 
241a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
241b0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
241c0 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66   if( nLen+1<nBuf
241d0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66   ){.        zBuf
241e0 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44  [nLen] = winGetD
241f0 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20  irSep();.       
24200 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20   zBuf[nLen+1] = 
24210 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65  '\0';.        re
24220 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
24230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24240 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
24250 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
24260 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  y file name and 
24270 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
24280 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ing pointer into
24290 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70   pzBuf..** The p
242a0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
242b0 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65  in pzBuf must be
242c0 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74   freed via sqlit
242d0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
242e0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
242f0 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
24300 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20  vfs *pVfs, char 
24310 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  **pzBuf){.  stat
24320 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
24330 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
24340 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
24350 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
24360 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
24370 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
24380 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
24390 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65  i, j;.  int nPre
243a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
243b0 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
243c0 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69  ILE_PREFIX);.  i
243d0 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e  nt nMax, nBuf, n
243e0 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61  Dir, nLen;.  cha
243f0 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49  r *zBuf;..  /* I
24400 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
24410 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
24420 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
24430 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
24440 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
24450 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
24460 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
24470 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
24480 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
24490 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a  ion failing..  *
244a0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
244b0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
244c0 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f  TE_IOERR );..  /
244d0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
244e0 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
244f0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79   store the fully
24500 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a   qualified file.
24510 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68    ** name for th
24520 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
24530 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  .  If this fails
24540 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74  , we cannot cont
24550 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61  inue..  */.  nMa
24560 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  x = pVfs->mxPath
24570 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61  name; nBuf = nMa
24580 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20  x + 2;.  zBuf = 
24590 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
245a0 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28  o( nBuf );.  if(
245b0 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53   !zBuf ){.    OS
245c0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
245d0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
245e0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
245f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24600 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
24610 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
24620 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
24630 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61  ffective tempora
24640 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46  ry directory.  F
24650 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f  irst, check if o
24660 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  ne.  ** has been
24670 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20   explicitly set 
24680 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
24690 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75  on; otherwise, u
246a0 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20  se the one.  ** 
246b0 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
246c0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
246d0 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20  em..  */.  nDir 
246e0 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b  = nMax - (nPre +
246f0 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20   15);.  assert( 
24700 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  nDir>0 );.  if( 
24710 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
24720 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  ectory ){.    in
24730 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69  t nDirLen = sqli
24740 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
24750 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
24760 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  ry);.    if( nDi
24770 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  rLen>0 ){.      
24780 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70  if( !winIsDirSep
24790 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
247a0 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d  rectory[nDirLen-
247b0 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  1]) ){.        n
247c0 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  DirLen++;.      
247d0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72  }.      if( nDir
247e0 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20  Len>nDir ){.    
247f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24800 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
24810 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
24820 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
24830 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
24840 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
24850 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24860 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
24870 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b  tTempname1", 0);
24880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
24890 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
248a0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
248b0 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
248c0 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
248d0 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
248e0 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
248f0 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
24900 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
24910 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
24920 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51  0, /* getenv("SQ
24930 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f  LITE_TMPDIR") */
24940 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
24950 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a  tenv("TMPDIR") *
24960 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
24970 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a  etenv("TMP") */.
24980 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
24990 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20  env("TEMP") */. 
249a0 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
249b0 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
249c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61  ) */.       "/va
249d0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
249e0 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
249f0 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20    "/tmp",.      
24a00 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20   ".",.       0  
24a10 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
24a20 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20  rminator */.    
24a30 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  };.    unsigned 
24a40 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
24a50 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
24a60 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ..    if( !azDir
24a70 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d  s[0] ) azDirs[0]
24a80 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
24a90 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  E_TMPDIR");.    
24aa0 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
24ab0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
24ac0 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
24ad0 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32     if( !azDirs[2
24ae0 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20  ] ) azDirs[2] = 
24af0 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20  getenv("TMP");. 
24b00 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33     if( !azDirs[3
24b10 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20  ] ) azDirs[3] = 
24b20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a  getenv("TEMP");.
24b30 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
24b40 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d  4] ) azDirs[4] =
24b50 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
24b60 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28  FILE");.    for(
24b70 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
24b80 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
24b90 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
24ba0 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
24bb0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
24bc0 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44  ed;.      if( zD
24bd0 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
24be0 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
24bf0 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69  e path starts wi
24c00 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
24c10 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  r followed by th
24c20 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a  e colon.      **
24c30 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75   character, assu
24c40 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  me it is already
24c50 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
24c60 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c  path; otherwise,
24c70 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73  .      ** it mus
24c80 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74  t be converted t
24c90 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  o a native Win32
24ca0 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79   path via the Cy
24cb0 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a  gwin API.      *
24cc0 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67  * prior to using
24cd0 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
24ce0 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69      if( winIsDri
24cf0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
24d00 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
24d10 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
24d20 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
24d30 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b  8Filename(zDir);
24d40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
24d50 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
24d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24d70 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
24d80 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
24d90 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
24da0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24db0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
24dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24dd0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
24de0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24df0 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
24e00 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
24e10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24e20 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
24e30 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69   zBuf, "%s", zDi
24e40 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
24e50 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
24e60 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
24e70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
24e80 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
24e90 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
24ea0 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed);.      }else
24eb0 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65  {.        zConve
24ec0 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61  rted = sqlite3Ma
24ed0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31  llocZero( nMax+1
24ee0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
24ef0 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
24f00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24f10 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
24f20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
24f30 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
24f40 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
24f50 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
24f60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24f70 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
24f80 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
24f90 20 20 20 20 20 20 20 69 66 28 20 63 79 67 77 69         if( cygwi
24fa0 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 49               osI
24fc0 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49  sNT() ? CCP_POSI
24fd0 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50  X_TO_WIN_W : CCP
24fe0 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c  _POSIX_TO_WIN_A,
24ff0 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20 20   zDir,.         
25000 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65         zConverte
25010 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a  d, nMax+1)<0 ){.
25020 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25030 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25040 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
25050 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
25060 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52  ;.          OSTR
25070 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
25080 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
25090 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29  ERR_CONVPATH\n")
250a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
250b0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
250c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
250d0 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
250e0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
25110 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  e2", zDir);.    
25120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25130 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
25140 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
25150 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
25160 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
25170 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72 65  e candidate dire
25180 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e 64  ctory exists and
25190 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20 20   should.        
251a0 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20 48    ** be used.  H
251b0 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20 6e  owever, we may n
251c0 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74  eed to convert t
251d0 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  he string contai
251e0 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ning.          *
251f0 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20  * its name into 
25200 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20 69  UTF-8 (i.e. if i
25210 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67 68  t is UTF-16 righ
25220 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20 20  t now)..        
25230 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
25240 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e  har *zUtf8 = win
25250 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
25260 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64  ename(zConverted
25270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25280 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
25290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
252a0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
252b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
252c0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
252d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
252e0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
252f0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
25300 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
25310 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
25320 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
25330 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
25340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25350 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
25360 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
25370 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
25380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25390 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
253a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
253b0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
253c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
253d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
253e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
253f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
25400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25410 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  #elif !SQLITE_OS
25420 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
25430 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
25440 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54   else if( osIsNT
25450 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
25460 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53  zMulti;.    LPWS
25470 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73  TR zWidePath = s
25480 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
25490 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43  ( nMax*sizeof(WC
254a0 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20  HAR) );.    if( 
254b0 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20  !zWidePath ){.  
254c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
254d0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
254e0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
254f0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
25500 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
25510 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
25520 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25530 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
25540 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50    if( osGetTempP
25550 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65  athW(nMax, zWide
25560 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Path)==0 ){.    
25570 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25580 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
25590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
255a0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
255b0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
255c0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
255d0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e  RR_GETTEMPPATH\n
255e0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
255f0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
25600 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
25610 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  MPPATH, osGetLas
25620 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
25650 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  me2", 0);.    }.
25660 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e      zMulti = win
25670 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  UnicodeToUtf8(zW
25680 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
25690 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
256a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
256b0 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
256c0 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %s", zMulti);.  
256d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
256e0 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20  (zMulti);.      
256f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
25700 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c  dePath);.    }el
25710 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
25720 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
25730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25740 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
25750 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
25760 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
25770 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
25780 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
25790 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
257a0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
257b0 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
257c0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
257d0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
257e0 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
257f0 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68   char *zMbcsPath
25800 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
25810 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20  Zero( nMax );.  
25820 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68    if( !zMbcsPath
25830 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25840 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
25850 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
25860 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
25870 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25880 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
25890 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
258a0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
258b0 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65    }.    if( osGe
258c0 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c  tTempPathA(nMax,
258d0 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29   zMbcsPath)==0 )
258e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
258f0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
25900 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
25910 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
25920 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
25930 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  PPATH\n"));.    
25940 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
25950 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
25960 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f  R_GETTEMPPATH, o
25970 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
25980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25990 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
259a0 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b  tTempname3", 0);
259b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
259c0 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38   = winMbcsToUtf8
259d0 28 7a 4d 62 63 73 50 61 74 68 2c 20 6f 73 41 72  (zMbcsPath, osAr
259e0 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29  eFileApisANSI())
259f0 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
25a00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25a10 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
25a20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66  zBuf, "%s", zUtf
25a30 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
25a40 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
25a50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25a60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
25a70 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
25a80 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
25a90 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
25aa0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
25ab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25ac0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
25ad0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  PT;.    }.  }.#e
25ae0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
25af0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f  IN32_HAS_ANSI */
25b00 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
25b10 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
25b20 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
25b30 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
25b40 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
25b50 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20 61  tory ends with a
25b60 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
25b70 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49  ** separator.  I
25b80 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e  f it does not an
25b90 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  d there is not e
25ba0 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
25bb0 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65   to add.  ** one
25bc0 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69  , fail..  */.  i
25bd0 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  f( !winMakeEndIn
25be0 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a  DirSep(nDir+1, z
25bf0 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Buf) ){.    sqli
25c00 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
25c10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
25c20 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
25c30 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
25c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
25c50 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25c60 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
25c70 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b  tTempname4", 0);
25c80 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
25c90 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
25ca0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
25cb0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
25cc0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
25cd0 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e  ile.  ** name in
25ce0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
25cf0 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ormat:.  **.  **
25d00 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64     "<temporary_d
25d10 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73  irectory>/etilqs
25d20 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  _XXXXXXXXXXXXXXX
25d30 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  \0\0".  **.  ** 
25d40 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  If not, return S
25d50 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68  QLITE_ERROR.  Th
25d60 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75  e number 17 is u
25d70 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65  sed here in orde
25d80 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e  r to.  ** accoun
25d90 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65 20  t for the space 
25da0 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20 63  used by the 15 c
25db0 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20  haracter random 
25dc0 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20  suffix and the. 
25dd0 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67   ** two trailing
25de0 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e   NUL characters.
25df0 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65    The final dire
25e00 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
25e10 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68  character.  ** h
25e20 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65 64  as already added
25e30 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
25e40 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a  lready present..
25e50 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71    */.  nLen = sq
25e60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
25e70 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e  uf);.  if( (nLen
25e80 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20   + nPre + 17) > 
25e90 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  nBuf ){.    sqli
25ea0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
25eb0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
25ec0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
25ed0 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
25ee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
25ef0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25f00 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
25f10 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b  tTempname5", 0);
25f20 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
25f30 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36  snprintf(nBuf-16
25f40 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e  -nLen, zBuf+nLen
25f50 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  , SQLITE_TEMP_FI
25f60 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a  LE_PREFIX);..  j
25f70 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
25f80 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  30(zBuf);.  sqli
25f90 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
25fa0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
25fb0 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
25fc0 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42  ++, j++){.    zB
25fd0 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
25fe0 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
25ff0 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
26000 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
26010 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ) ];.  }.  zBuf[
26020 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a  j] = 0;.  zBuf[j
26030 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75  +1] = 0;.  *pzBu
26040 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54  f = zBuf;..  OST
26050 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
26060 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  NAME name=%s, rc
26070 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a  =SQLITE_OK\n", z
26080 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
26090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
260a0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
260b0 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
260c0 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69  e is really a di
260d0 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e  rectory.  Return
260e0 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20   false if.** it 
260f0 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
26100 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74  er than a direct
26110 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ory, or if there
26120 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
26130 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
26140 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  tion failure..*/
26150 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
26160 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
26170 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20  *zConverted){.  
26180 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
26190 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
261a0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
261b0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
261c0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
261d0 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
261e0 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
261f0 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
26200 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
26210 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
26220 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
26230 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
26240 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
26250 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
26260 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
26290 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
262c0 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
262d0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
262e0 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
262f0 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
26300 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76  return 0; /* Inv
26310 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20  alid name? */.  
26320 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73    }.    attr = s
26330 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
26340 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53  ttributes;.#if S
26350 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
26360 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
26370 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
26380 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
26390 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
263a0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
263b0 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49  rn (attr!=INVALI
263c0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
263d0 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45  S) && (attr&FILE
263e0 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
263f0 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TORY);.}../*.** 
26400 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
26410 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
26420 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
26430 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
26440 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d  /* Used to get m
26450 61 78 69 6d 75 6d 20 70 61 74 68 20 6c 65 6e 67  aximum path leng
26460 74 68 20 61 6e 64 20 41 70 70 44 61 74 61 20 2a  th and AppData *
26470 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26480 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
26490 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
264a0 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
264b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
264c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
264d0 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
264e0 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
264f0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26510 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
26520 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
26530 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
26540 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
26550 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
26560 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
26570 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
26580 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
26590 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
265a0 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
265b0 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
265c0 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
265d0 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
265e0 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
265f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
26600 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
26610 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
26620 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70 70  VfsAppData *pApp
26630 44 61 74 61 3b 0a 20 20 77 69 6e 46 69 6c 65 20  Data;.  winFile 
26640 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
26650 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
26660 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
26670 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
26680 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
26690 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
266a0 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
266b0 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
266c0 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
266d0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
266e0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
266f0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
26700 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
26710 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
26720 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
26730 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
26740 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
26750 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
26760 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
26770 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
26780 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b  r *zTmpname = 0;
26790 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72   /* For temporar
267a0 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e  y filename, if n
267b0 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20  ecessary. */..  
267c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
267d0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
267e0 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
267f0 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
26800 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
26810 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
26820 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
26830 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
26840 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
26850 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
26860 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
26870 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
26880 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
26890 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
268a0 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
268b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
268c0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
268d0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
268e0 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
268f0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
26900 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
26910 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
26920 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
26930 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
26940 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
26950 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
26960 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
26970 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  E);..#ifndef NDE
26980 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e  BUG.  int isOpen
26990 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65  Journal = (isCre
269a0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
269b0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
269c0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
269d0 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  AL.     || eType
269e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
269f0 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  IN_JOURNAL.     
26a00 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
26a10 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
26a20 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
26a30 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
26a40 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67  , pFile=%p, flag
26a50 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  s=%x, pOutFlags=
26a60 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
26a70 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c    zUtf8Name, id,
26a80 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
26a90 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s));..  /* Check
26aa0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
26ab0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
26ac0 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
26ad0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
26ae0 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
26af0 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
26b00 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
26b10 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20   and.  **   (b) 
26b20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
26b30 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
26b40 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
26b50 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
26b60 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
26b70 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
26b80 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
26b90 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
26ba0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
26bb0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
26bc0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
26bd0 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
26be0 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
26bf0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
26c00 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
26c10 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
26c20 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
26c30 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
26c40 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
26c50 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
26c60 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
26c70 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
26c80 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
26c90 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
26ca0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
26cb0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
26cc0 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
26cd0 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20  nal are never.  
26ce0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
26cf0 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
26d00 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
26d10 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
26d20 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
26d30 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
26d40 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
26d50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
26d60 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
26d70 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
26d80 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
26d90 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
26da0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
26db0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
26dc0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
26dd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
26de0 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
26df0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
26e00 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
26e10 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
26e20 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
26e30 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
26e40 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
26e50 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
26e60 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
26e70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
26e80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
26e90 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
26ea0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
26eb0 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20  PEN_TEMP_DB.    
26ec0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
26ed0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
26ee0 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
26ef0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
26f00 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20  _JOURNAL.       
26f10 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
26f20 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
26f30 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
26f40 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
26f50 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c  JOURNAL.       |
26f60 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
26f70 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
26f80 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
26f90 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
26fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
26fb0 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e!=0 );.  memset
26fc0 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
26fd0 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70  f(winFile));.  p
26fe0 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  File->h = INVALI
26ff0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
27000 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
27010 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66  INRT.  if( !zUtf
27020 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65  8Name && !sqlite
27030 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
27040 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
27050 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  log(SQLITE_ERROR
27060 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74  ,.        "sqlit
27070 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
27080 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c  y variable shoul
27090 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e  d be set for Win
270a0 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RT");.  }.#endif
270b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65  ..  /* If the se
270c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
270d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
270e0 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65  s NULL, generate
270f0 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
27100 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75  y file name to u
27110 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a  se.  */.  if( !z
27120 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20  Utf8Name ){.    
27130 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65  assert( isDelete
27140 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e   && !isOpenJourn
27150 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  al );.    rc = w
27160 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  inGetTempname(pV
27170 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a  fs, &zTmpname);.
27180 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f  TE_OK ){.      O
271a0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
271b0 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a  me=%s, rc=%s", z
271c0 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65  Utf8Name, sqlite
271d0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
271e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
271f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
27200 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
27210 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62  .  }..  /* Datab
27220 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
27230 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
27240 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
27250 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52   are not.  ** UR
27260 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
27270 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
27280 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
27290 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  assed into.  ** 
272a0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
272b0 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  meter()..  */.  
272c0 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d  assert( (eType!=
272d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
272e0 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26  _DB) || (flags &
272f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
27300 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66  ) ||.       zUtf
27310 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  8Name[sqlite3Str
27320 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29  len30(zUtf8Name)
27330 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  +1]==0 );..  /* 
27340 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
27350 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
27360 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
27370 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
27380 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
27390 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
273a0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
273b0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
273c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
273d0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
273e0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
273f0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
27400 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74  OERR_NOMEM", zUt
27410 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
27420 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27430 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
27440 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69  }..  if( winIsDi
27450 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
27460 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27470 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
27480 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27490 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f  zTmpname);.    O
274a0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
274b0 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
274c0 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22  _CANTOPEN_ISDIR"
274d0 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20  , zUtf8Name));. 
274e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
274f0 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b  _CANTOPEN_ISDIR;
27500 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
27510 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64  adWrite ){.    d
27520 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
27530 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
27540 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20  GENERIC_WRITE;. 
27550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65   }else{.    dwDe
27560 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
27570 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a  NERIC_READ;.  }.
27580 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  /* SQLITE_OPE
27590 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75  N_EXCLUSIVE is u
275a0 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
275b0 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65   that a new file
275c0 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   is.  ** created
275d0 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74  . SQLite doesn't
275e0 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63   use it to indic
275f0 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61  ate "exclusive a
27600 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73 20 69  ccess".  ** as i
27610 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
27620 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
27630 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
27640 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
27650 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
27660 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
27670 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
27680 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
27690 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
276a0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
276b0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
276c0 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
276d0 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
276e0 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
276f0 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
27700 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
27710 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
27720 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
27730 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
27740 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
27750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
27760 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
27770 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
27780 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
27790 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
277a0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
277b0 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
277c0 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
277d0 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
277e0 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
277f0 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
27800 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
27810 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
27820 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
27830 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
27840 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
27850 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
27860 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
27870 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
27880 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278a0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
278b0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
278c0 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278e0 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
278f0 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
27900 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
27910 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
27920 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
27930 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
27940 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
27950 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
27960 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
27970 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
27980 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
27990 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
279a0 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
279b0 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
279c0 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
279d0 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
279e0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
279f0 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
27a00 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
27a10 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  if..  if( osIsNT
27a20 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
27a30 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52  _OS_WINRT.    CR
27a40 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
27a50 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78  ED_PARAMETERS ex
27a60 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
27a70 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
27a80 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20  rameters.dwSize 
27a90 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46  = sizeof(CREATEF
27aa0 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
27ab0 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65  RAMETERS);.    e
27ac0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
27ad0 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  s.dwFileAttribut
27ae0 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  es =.           
27af0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
27b00 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54  butes & FILE_ATT
27b10 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20  RIBUTE_MASK;.   
27b20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
27b30 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20  ers.dwFileFlags 
27b40 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  = dwFlagsAndAttr
27b50 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c  ibutes & FILE_FL
27b60 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  AG_MASK;.    ext
27b70 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
27b80 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61  dwSecurityQosFla
27b90 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e  gs = SECURITY_AN
27ba0 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74  ONYMOUS;.    ext
27bb0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
27bc0 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69 62  lpSecurityAttrib
27bd0 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utes = NULL;.   
27be0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
27bf0 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c  ers.hTemplateFil
27c00 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68  e = NULL;.    wh
27c10 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
27c20 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52  teFile2((LPCWSTR
27c30 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
27c60 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
27c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c80 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
27c90 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20  eMode,.         
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cb0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
27cc0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ce0 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65 6e            &exten
27cf0 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d  dedParameters))=
27d00 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
27d10 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49         winRetryI
27d40 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
27d50 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
27d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
27d70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a   */.    }.#else.
27d80 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
27d90 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c  osCreateFileW((L
27da0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
27db0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
27de0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
27e10 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
27e40 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
27e70 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
27ea0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
27eb0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
27ee0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
27ef0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
27f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
27f10 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p */.    }.#endi
27f20 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
27f30 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
27f40 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77  SI.  else{.    w
27f50 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
27f60 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52  ateFileA((LPCSTR
27f70 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
27fa0 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
27fd0 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ff0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
28000 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
28010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
28040 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
28070 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
28080 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
280b0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
280c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
280d0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
280e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
280f0 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
28100 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20  t, __LINE__);.. 
28110 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
28120 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
28130 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63  , access=%lx, rc
28140 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
28150 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
28160 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
28170 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
28180 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
28190 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
281a0 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
281b0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
281c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
281d0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
281e0 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
281f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28200 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
28210 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
28220 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
28230 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28240 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
28250 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
28260 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
28270 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
28280 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
28290 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
282a0 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
282b0 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28  , id,.         (
282c0 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50  (flags|SQLITE_OP
282d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20  EN_READONLY) &. 
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45      ~(SQLITE_OPE
28300 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
28310 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29  OPEN_READWRITE))
28320 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46  ,.         pOutF
28330 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lags);.    }else
28340 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
28350 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
28360 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
28370 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
28380 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  ){.    if( isRea
28390 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  dWrite ){.      
283a0 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
283b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
283c0 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
283d0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
283e0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
283f0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
28400 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  }..  OSTRACE(("O
28410 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d  PEN file=%p, nam
28420 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78  e=%s, access=%lx
28430 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20  , pOutFlags=%p, 
28440 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22  *pOutFlags=%d, "
28450 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d  .           "rc=
28460 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e  %s\n", h, zUtf8N
28470 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
28480 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c  cess, pOutFlags,
28490 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20   pOutFlags ?.   
284a0 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61          *pOutFla
284b0 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41  gs : 0, (h==INVA
284c0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
284d0 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
284e0 6f 6b 22 29 29 3b 0a 0a 20 20 70 41 70 70 44 61  ok"));..  pAppDa
284f0 74 61 20 3d 20 28 77 69 6e 56 66 73 41 70 70 44  ta = (winVfsAppD
28500 61 74 61 2a 29 70 56 66 73 2d 3e 70 41 70 70 44  ata*)pVfs->pAppD
28510 61 74 61 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  ata;..#if SQLITE
28520 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 0a 20 20  _OS_WINCE.  {.  
28530 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
28540 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
28550 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
28560 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 41           && ((pA
28570 70 70 44 61 74 61 3d 3d 4e 55 4c 4c 29 20 7c 7c  ppData==NULL) ||
28580 20 21 70 41 70 70 44 61 74 61 2d 3e 62 4e 6f 4c   !pAppData->bNoL
28590 6f 63 6b 29 0a 20 20 20 20 20 20 20 20 20 26 26  ock).         &&
285a0 20 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61   (rc = winceCrea
285b0 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46  teLock(zName, pF
285c0 69 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ile))!=SQLITE_OK
285d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6f 73  .    ){.      os
285e0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a  CloseHandle(h);.
285f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28600 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28610 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28620 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
28630 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
28640 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d  EN-CE-LOCK name=
28650 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e  %s, rc=%s\n", zN
28660 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
28670 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
28680 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28690 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  }.  }.  if( isTe
286a0 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  mp ){.    pFile-
286b0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
286c0 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
286d0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
286e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
286f0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28700 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
28710 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
28720 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
28730 20 70 41 70 70 44 61 74 61 20 3f 20 70 41 70 70   pAppData ? pApp
28740 44 61 74 61 2d 3e 70 4d 65 74 68 6f 64 20 3a 20  Data->pMethod : 
28750 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  &winIoMethod;.  
28760 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56  pFile->pVfs = pV
28770 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  fs;.  pFile->h =
28780 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64   h;.  if( isRead
28790 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c  only ){.    pFil
287a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
287b0 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  WINFILE_RDONLY;.
287c0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
287d0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e  3_uri_boolean(zN
287e0 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c  ame, "psow", SQL
287f0 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
28800 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
28810 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
28820 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57   |= WINFILE_PSOW
28830 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
28840 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
28850 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50  ROR;.  pFile->zP
28860 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66  ath = zName;.#if
28870 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
28880 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d  _SIZE>0.  pFile-
28890 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
288a0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
288b0 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  n = 0;.  pFile->
288c0 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
288d0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
288e0 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69  ctual = 0;.  pFi
288f0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
28900 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
28910 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
28920 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e  ndif..  OpenCoun
28930 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
28940 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
28950 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
28960 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
28970 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f   that Windows do
28980 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
28990 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
289a0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
289b0 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
289c0 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
289d0 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
289e0 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
289f0 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
28a00 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
28a10 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
28a20 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
28a30 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
28a40 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
28a50 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
28a60 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
28a70 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
28a80 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
28a90 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
28aa0 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
28ab0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
28ac0 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
28ad0 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
28ae0 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
28af0 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
28b00 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
28b10 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
28b20 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
28b30 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
28b40 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
28b50 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
28b60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
28b70 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
28b80 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
28b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
28ba0 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
28bb0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28bc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
28bd0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
28be0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
28bf0 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
28c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
28c10 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
28c20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
28c30 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
28c40 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44   DWORD attr;.  D
28c50 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
28c60 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
28c70 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
28c80 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
28c90 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28ca0 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a  ETER(syncDir);..
28cb0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
28cc0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
28cd0 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
28ce0 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
28cf0 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44  E name=%s, syncD
28d00 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e  ir=%d\n", zFilen
28d10 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a  ame, syncDir));.
28d20 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
28d30 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
28d40 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
28d50 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
28d60 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
28d70 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
28d80 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  TE name=%s, rc=S
28d90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
28da0 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  M\n", zFilename)
28db0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28dc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28dd0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
28de0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
28df0 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45   do {.#if SQLITE
28e00 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
28e10 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
28e20 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
28e30 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ata;.      memse
28e40 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
28e50 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
28e60 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  a));.      if ( 
28e70 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
28e80 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65  tesExW(zConverte
28e90 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  d, GetFileExInfo
28ea0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
28ed0 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20  trData) ){.     
28ee0 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
28ef0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
28f00 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73  utes;.      }els
28f10 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  e{.        lastE
28f20 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
28f30 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
28f40 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
28f50 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
28f60 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
28f70 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
28f80 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
28f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28fa0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
28fb0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
28fc0 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
28fd0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
28fe0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28ff0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29010 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
29020 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
29030 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
29040 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
29050 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
29060 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
29070 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
29080 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
29090 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
290a0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
290b0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
290c0 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
290d0 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
290e0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
290f0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
29100 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
29110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
29120 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
29130 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
29140 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
29150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
29160 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
29170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29190 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
291a0 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
291b0 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
291c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
291d0 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
291e0 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
291f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29200 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
29210 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
29220 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
29230 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29240 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
29250 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
29260 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
29270 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
29280 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
29290 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
292a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
292b0 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
292c0 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
292d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
292e0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
292f0 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
29300 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
29310 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
29320 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
29330 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
29340 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
29350 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
29360 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
29370 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
29380 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
29390 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
293a0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
293b0 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
293c0 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
293d0 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
293e0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
293f0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
29400 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
29410 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
29420 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
29430 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
29440 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
29460 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
29470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
29480 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29490 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
294a0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
294b0 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
294c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
294d0 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
294e0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
294f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29500 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
29510 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
29520 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
29530 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
29540 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
29550 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
29570 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
29580 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
29590 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
295a0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
295b0 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
295c0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
295d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
295e0 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
295f0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
29600 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  c && rc!=SQLITE_
29610 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
29620 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  NT ){.    rc = w
29630 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
29640 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
29650 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44  lastErrno, "winD
29660 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
29670 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
29680 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
29690 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
296a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
296b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f  zConverted);.  O
296c0 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
296d0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
296e0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  ", zFilename, sq
296f0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
29700 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
29710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
29720 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e  the existence an
29730 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69  d status of a fi
29740 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
29750 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73  t winAccess(.  s
29760 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29770 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ,         /* Not
29780 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
29790 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
297a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f  zFilename,     /
297b0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
297c0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
297d0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
297e0 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
297f0 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20  of test to make 
29800 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
29810 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29830 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29  OUT: Result */.)
29840 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
29850 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
29860 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
29870 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  = 0;.  void *zCo
29880 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
29890 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
298a0 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
298b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
298c0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
298d0 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  S; );.  OSTRACE(
298e0 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
298f0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73  , flags=%x, pRes
29900 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  Out=%p\n",.     
29910 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
29920 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29   flags, pResOut)
29930 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
29940 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
29950 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
29960 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
29970 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
29980 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
29990 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72  CCESS name=%s, r
299a0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
299b0 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
299c0 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
299d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
299e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
299f0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
29a00 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
29a10 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
29a20 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
29a30 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
29a40 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
29a50 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
29a60 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
29a70 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
29a80 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
29a90 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
29aa0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
29ad0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
29b00 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
29b10 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
29b20 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
29b30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
29b40 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
29b50 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
29b60 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
29b70 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
29b80 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
29b90 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
29ba0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29bb0 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
29bc0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
29bd0 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
29be0 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
29bf0 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20  zeHigh==0.      
29c00 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
29c10 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30  .nFileSizeLow==0
29c20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
29c30 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
29c40 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
29c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29c60 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
29c70 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
29c80 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  es;.      }.    
29c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e  }else{.      win
29ca0 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f  LogIoerr(cnt, __
29cb0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69  LINE__);.      i
29cc0 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  f( lastErrno!=ER
29cd0 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
29ce0 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21  ND && lastErrno!
29cf0 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
29d00 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
29d10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
29d20 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
29d30 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
29d40 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
29d50 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45  RR_ACCESS, lastE
29d60 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73  rrno, "winAccess
29d70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46                zF
29d90 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
29da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
29db0 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
29dc0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
29dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29de0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
29df0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
29e00 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
29e10 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
29e20 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
29e30 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
29e40 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
29e50 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29e60 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
29e70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
29e80 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
29e90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
29ea0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
29eb0 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
29ec0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
29ed0 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
29ee0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
29ef0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
29f00 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72  ADWRITE:.      r
29f10 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
29f20 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
29f30 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  S &&.           
29f40 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41    (attr & FILE_A
29f50 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c  TTRIBUTE_READONL
29f60 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65  Y)==0;.      bre
29f70 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
29f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
29f90 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
29fa0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
29fb0 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
29fc0 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
29fd0 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f  S name=%s, pResO
29fe0 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d  ut=%p, *pResOut=
29ff0 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %d, rc=SQLITE_OK
2a000 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a010 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f  zFilename, pResO
2a020 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a  ut, *pResOut));.
2a030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a040 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
2a050 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
2a060 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2a070 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
2a080 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74  with a drive let
2a090 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  ter.** followed 
2a0a0 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61  by a colon chara
2a0b0 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
2a0c0 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c  BOOL winIsDriveL
2a0d0 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20  etterAndColon(. 
2a0e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2a0f0 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75  thname.){.  retu
2a100 72 6e 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c  rn ( sqlite3Isal
2a110 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  pha(zPathname[0]
2a120 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31  ) && zPathname[1
2a130 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ]==':' );.}../*.
2a140 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
2a150 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
2a160 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73  fied path name s
2a170 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65  hould be used ve
2a180 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e  rbatim.  If.** n
2a190 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
2a1a0 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ned from this fu
2a1b0 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c  nction, the call
2a1c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
2a1d0 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20  t simply.** use 
2a1e0 74 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74  the provided pat
2a1f0 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20  h name verbatim 
2a200 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20  -OR- resolve it 
2a210 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
2a220 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74   name.** using t
2a230 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  he GetFullPathNa
2a240 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e  me Win32 API fun
2a250 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61  ction (if availa
2a260 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ble)..*/.static 
2a270 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74  BOOL winIsVerbat
2a280 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f  imPathname(.  co
2a290 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  nst char *zPathn
2a2a0 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  ame.){.  /*.  **
2a2b0 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d   If the path nam
2a2c0 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
2a2d0 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72  forward slash or
2a2e0 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74   a backslash, it
2a2f0 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20   is either.  ** 
2a300 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65  a legal UNC name
2a310 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  , a volume relat
2a320 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20  ive path, or an 
2a330 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61  absolute path na
2a340 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  me in the.  ** "
2a350 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20  Unix" format on 
2a360 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20  Windows.  There 
2a370 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74  is no easy way t
2a380 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20  o differentiate 
2a390 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
2a3a0 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73   final two cases
2a3b0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20  ; therefore, we 
2a3c0 72 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72  return the safer
2a3d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2a3e0 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68   TRUE.  ** so th
2a3f0 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68  at callers of th
2a400 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2a410 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76   simply use it v
2a420 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20  erbatim..  */.  
2a430 69 66 20 28 20 77 69 6e 49 73 44 69 72 53 65 70  if ( winIsDirSep
2a440 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29  (zPathname[0]) )
2a450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
2a460 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
2a470 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61  * If the path na
2a480 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
2a490 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f   letter and a co
2a4a0 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72  lon it is either
2a4b0 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72   a volume.  ** r
2a4c0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20  elative path or 
2a4d0 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
2a4e0 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68  .  Callers of th
2a4f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
2a500 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70   not.  ** attemp
2a510 74 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73  t to treat it as
2a520 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2a530 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79   name (i.e. they
2a540 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75   should simply u
2a550 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61  se.  ** it verba
2a560 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  tim)..  */.  if 
2a570 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  ( winIsDriveLett
2a580 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68  erAndColon(zPath
2a590 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74  name) ){.    ret
2a5a0 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
2a5b0 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67   /*.  ** If we g
2a5c0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
2a5d0 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  , the path name 
2a5e0 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65  should almost ce
2a5f0 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72  rtainly be a pur
2a600 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ely.  ** relativ
2a610 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20  e one (i.e. not 
2a620 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20  a UNC name, not 
2a630 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f  absolute, and no
2a640 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  t volume relativ
2a650 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  e)..  */.  retur
2a660 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  n FALSE;.}../*.*
2a670 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
2a680 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
2a690 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
2a6a0 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
2a6b0 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
2a6c0 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
2a6d0 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
2a6e0 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
2a6f0 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
2a700 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
2a710 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
2a720 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
2a730 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2a740 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2a750 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2a760 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a770 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
2a780 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
2a790 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
2a7a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
2a7d0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
2a7e0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
2a7f0 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
2a800 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2a810 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
2a820 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2a830 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
2a840 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
2a850 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
2a860 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a  .  DWORD nByte;.
2a870 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
2a880 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
2a890 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
2a8a0 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65  f this path name
2a8b0 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58   begins with "/X
2a8c0 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73  :", where "X" is
2a8d0 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a   any alphabetic.
2a8e0 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
2a8f0 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74  discard the init
2a900 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65  ial "/" from the
2a910 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   pathname..  */.
2a920 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
2a930 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e 49 73  0]=='/' && winIs
2a940 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
2a950 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b 31 29  lon(zRelative+1)
2a960 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76   ){.    zRelativ
2a970 65 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65  e++;.  }..#if de
2a980 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
2a990 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
2a9a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2a9b0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
2a9c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2a9d0 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Full);.  assert(
2a9e0 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
2a9f0 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
2aa00 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
2aa10 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
2aa20 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
2aa30 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
2aa40 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2aa50 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
2aa60 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
2aa70 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
2aa80 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
2aa90 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
2aaa0 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
2aab0 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
2aac0 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
2aad0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
2aae0 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
2aaf0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
2ab00 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
2ab10 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
2ab20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
2ab30 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
2ab40 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
2ab50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
2ab60 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
2ab70 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
2ab80 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
2ab90 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
2aba0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2abb0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2abc0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2abd0 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
2abe0 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
2abf0 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
2ac00 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
2ac10 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
2ac20 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20  _TO_WIN_A) |.   
2ac30 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c           CCP_REL
2ac40 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
2ac50 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
2ac60 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
2ac70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2ac80 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
2ac90 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
2aca0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2acb0 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
2acc0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ace0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2acf0 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
2ad00 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
2ad10 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
2ad20 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
2ad30 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
2ad40 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
2ad50 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
2ad60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
2ad70 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2ad80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2ad90 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2ada0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2adb0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2adc0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2add0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2ade0 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae00 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
2ae10 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
2ae20 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38 29 3b  irSep(), zUtf8);
2ae30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2ae40 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
2ae50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ae60 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Out);.    }.  }e
2ae70 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
2ae80 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Out = sqlite3Mal
2ae90 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d  locZero( pVfs->m
2aea0 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20  xPathname+1 );. 
2aeb0 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a     if( !zOut ){.
2aec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2aed0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2aee0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2aef0 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
2af00 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
2af10 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43    (osIsNT() ? CC
2af20 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
2af30 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
2af40 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20  WIN_A),.        
2af50 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a      zRelative, z
2af60 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
2af70 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
2af80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2af90 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
2afa0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2afb0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2afc0 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
2afd0 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aff0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
2b000 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
2b010 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b020 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
2b030 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
2b040 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
2b050 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
2b060 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
2b070 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2b080 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b090 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2b0a0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
2b0b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2b0c0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2b0d0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2b0e0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2b0f0 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
2b100 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
2b110 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
2b120 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
2b130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2b140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
2b150 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
2b160 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
2b170 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26  LITE_OS_WINRT) &
2b180 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
2b190 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
2b1a0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2b1b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
2b1c0 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
2b1d0 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
2b1e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2b1f0 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
2b200 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52  ld. */.  /* WinR
2b210 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20  T has no way to 
2b220 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69  convert a relati
2b230 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62  ve path to an ab
2b240 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20  solute one. */. 
2b250 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
2b260 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
2b270 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
2b280 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
2b290 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
2b2a0 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
2b2b0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
2b2c0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2b2d0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
2b2e0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
2b2f0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
2b300 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
2b310 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
2b320 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
2b330 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
2b340 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
2b350 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
2b360 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
2b370 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
2b380 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
2b390 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
2b3a0 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
2b3b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2b3c0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2b3d0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2b3e0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
2b3f0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
2b400 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b410 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
2b420 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
2b430 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
2b440 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2b450 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2b460 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2b470 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2b480 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
2b490 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2b4a0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
2b4b0 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
2b4c0 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
2b4d0 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
2b4e0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
2b4f0 5f 29 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  _).  /* It's odd
2b500 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2b510 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2b520 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2b530 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2b540 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2b550 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2b560 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2b570 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2b580 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2b590 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
2b5a0 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
2b5b0 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
2b5c0 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
2b5d0 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
2b5e0 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
2b5f0 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
2b600 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2b610 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2b620 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  R );.  if ( sqli
2b630 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2b640 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
2b650 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
2b660 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
2b670 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
2b680 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2b690 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
2b6a0 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
2b6b0 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
2b6c0 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
2b6d0 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
2b6e0 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
2b6f0 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
2b700 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
2b710 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
2b720 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
2b730 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
2b740 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
2b750 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
2b760 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
2b770 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
2b780 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2b790 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2b7a0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2b7b0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2b7c0 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b7e0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
2b7f0 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
2b800 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65  Sep(), zRelative
2b810 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2b820 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a  LITE_OK;.  }.  z
2b830 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
2b840 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
2b850 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
2b860 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
2b870 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
2b880 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2b890 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2b8a0 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
2b8b0 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a   ){.    LPWSTR z
2b8c0 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
2b8d0 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2b8e0 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
2b8f0 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
2b900 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2b910 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2b920 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2b930 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
2b940 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2b950 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2b960 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
2b970 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b990 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
2b9a0 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74  thname1", zRelat
2b9b0 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
2b9c0 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20  nByte += 3;.    
2b9d0 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d  zTemp = sqlite3M
2b9e0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
2b9f0 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
2ba00 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
2ba10 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
2ba20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2ba30 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2ba40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2ba50 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2ba60 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
2ba70 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
2ba80 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
2ba90 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
2baa0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
2bab0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2bac0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bad0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2bae0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2baf0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
2bb00 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2bb10 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2bb20 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2bb30 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb50 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2bb60 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
2bb70 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2bb80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2bb90 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2bba0 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
2bbb0 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
2bbc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bbd0 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66  (zTemp);.  }.#if
2bbe0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2bbf0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
2bc00 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
2bc10 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
2bc20 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
2bc30 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
2bc40 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
2bc50 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2bc60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2bc70 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2bc80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2bc90 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2bca0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2bcb0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2bcc0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bce0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2bcf0 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e3", zRelative);
2bd00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
2bd10 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
2bd20 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2bd30 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
2bd40 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
2bd50 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
2bd60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2bd70 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2bd80 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
2bd90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2bda0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2bdb0 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2bdc0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
2bdd0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
2bde0 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
2bdf0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2be00 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2be10 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2be20 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
2be30 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
2be40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2be50 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2be60 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2be70 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2be80 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bea0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2beb0 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e4", zRelative);
2bec0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2bed0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2bee0 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
2bef0 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54  winMbcsToUtf8(zT
2bf00 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  emp, osAreFileAp
2bf10 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 73  isANSI());.    s
2bf20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
2bf30 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  p);.  }.#endif. 
2bf40 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20   if( zOut ){.   
2bf50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2bf60 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2bf70 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2bf80 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
2bf90 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2bfa0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
2bfb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bfc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2bfd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2bfe0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2bff0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66   }.#endif.}..#if
2c000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c010 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
2c020 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
2c030 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
2c040 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
2c050 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
2c060 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
2c070 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
2c080 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
2c090 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
2c0a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2c0b0 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
2c0c0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
2c0d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2c0e0 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
2c0f0 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  h;.#if defined(_
2c100 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74  _CYGWIN__).  int
2c110 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d   nFull = pVfs->m
2c120 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63  xPathname+1;.  c
2c130 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c  har *zFull = sql
2c140 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2c150 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20  nFull );.  void 
2c160 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b  *zConverted = 0;
2c170 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20  .  if( zFull==0 
2c180 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
2c190 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
2c1a0 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
2c1b0 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
2c1c0 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
2c1d0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69   0;.  }.  if( wi
2c1e0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  nFullPathname(pV
2c1f0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
2c200 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51  Full, zFull)!=SQ
2c210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2c220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
2c230 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  l);.    OSTRACE(
2c240 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
2c250 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
2c260 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
2c270 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
2c280 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76  n 0;.  }.  zConv
2c290 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
2c2a0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
2c2b0 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c  me(zFull);.  sql
2c2c0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29  ite3_free(zFull)
2c2d0 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a  ;.#else.  void *
2c2e0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
2c2f0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
2c300 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
2c310 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
2c320 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65  AMETER(pVfs);.#e
2c330 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ndif.  if( zConv
2c340 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
2c350 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
2c360 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
2c370 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
2c380 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20  e, (void*)0));. 
2c390 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2c3a0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
2c3b0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
2c3c0 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f  _WINRT.    h = o
2c3d0 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  sLoadPackagedLib
2c3e0 72 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43  rary((LPCWSTR)zC
2c3f0 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65  onverted, 0);.#e
2c400 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  lse.    h = osLo
2c410 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57  adLibraryW((LPCW
2c420 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  STR)zConverted);
2c430 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
2c440 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2c450 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
2c460 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
2c470 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a  ibraryA((char*)z
2c480 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
2c490 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
2c4a0 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
2c4b0 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
2c4c0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
2c4d0 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65  d*)h));.  sqlite
2c4e0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2c4f0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
2c500 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
2c510 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
2c520 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2c530 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2c540 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
2c550 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2c560 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c  pVfs);.  winGetL
2c570 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
2c580 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
2c590 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  uf, zBufOut);.}.
2c5a0 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69  static void (*wi
2c5b0 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  nDlSym(sqlite3_v
2c5c0 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70  fs *pVfs,void *p
2c5d0 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  H,const char *zS
2c5e0 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41  ym))(void){.  FA
2c5f0 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e  RPROC proc;.  UN
2c600 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2c610 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f  Vfs);.  proc = o
2c620 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
2c630 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79  ((HANDLE)pH, zSy
2c640 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  m);.  OSTRACE(("
2c650 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c  DLSYM handle=%p,
2c660 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72   symbol=%s, addr
2c670 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ess=%p\n",.     
2c680 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c        (void*)pH,
2c690 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72   zSym, (void*)pr
2c6a0 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  oc));.  return (
2c6b0 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72  void(*)(void))pr
2c6c0 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  oc;.}.static voi
2c6d0 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c  d winDlClose(sql
2c6e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2c6f0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
2c700 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2c710 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72  ER(pVfs);.  osFr
2c720 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c  eeLibrary((HANDL
2c730 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53  E)pHandle);.  OS
2c740 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20  TRACE(("DLCLOSE 
2c750 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76  handle=%p\n", (v
2c760 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a  oid*)pHandle));.
2c770 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
2c780 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2c790 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
2c7a0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
2c7b0 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
2c7c0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
2c7d0 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
2c7e0 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
2c7f0 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
2c800 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53  e 0.#endif../* S
2c810 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
2c820 20 66 6f 72 20 74 68 65 20 72 61 6e 64 6f 6d 6e   for the randomn
2c830 65 73 73 20 67 61 74 68 65 72 65 72 2e 20 2a 2f  ess gatherer. */
2c840 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2c850 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20  EntropyGatherer 
2c860 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 3b  EntropyGatherer;
2c870 0a 73 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47  .struct EntropyG
2c880 61 74 68 65 72 65 72 20 7b 0a 20 20 75 6e 73 69  atherer {.  unsi
2c890 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 20 20 20  gned char *a;   
2c8a0 2f 2a 20 47 61 74 68 65 72 20 65 6e 74 72 6f 70  /* Gather entrop
2c8b0 79 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  y into this buff
2c8c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 3b 20  er */.  int na; 
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c8e0 69 7a 65 20 6f 66 20 61 5b 5d 20 69 6e 20 62 79  ize of a[] in by
2c8f0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  tes */.  int i; 
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c910 58 4f 52 20 6e 65 78 74 20 69 6e 70 75 74 20 69  XOR next input i
2c920 6e 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20 20 69 6e  nto a[i] */.  in
2c930 74 20 6e 58 6f 72 3b 20 20 20 20 20 20 20 20 20  t nXor;         
2c940 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 58    /* Number of X
2c950 4f 52 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f  OR operations do
2c960 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 21 64  ne */.};..#if !d
2c970 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2c980 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ST) && !defined(
2c990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
2c9a0 4f 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69 78 20 73  OMNESS)./* Mix s
2c9b0 7a 20 62 79 74 65 73 20 6f 66 20 65 6e 74 72 6f  z bytes of entro
2c9c0 70 79 20 69 6e 74 6f 20 70 2e 20 2a 2f 0a 73 74  py into p. */.st
2c9d0 61 74 69 63 20 76 6f 69 64 20 78 6f 72 4d 65 6d  atic void xorMem
2c9e0 6f 72 79 28 45 6e 74 72 6f 70 79 47 61 74 68 65  ory(EntropyGathe
2c9f0 72 65 72 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  rer *p, unsigned
2ca00 20 63 68 61 72 20 2a 78 2c 20 69 6e 74 20 73 7a   char *x, int sz
2ca10 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  ){.  int j, k;. 
2ca20 20 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70 2d 3e 69   for(j=0, k=p->i
2ca30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20  ; j<sz; j++){.  
2ca40 20 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e 3d 20 78    p->a[k++] ^= x
2ca50 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d  [j];.    if( k>=
2ca60 70 2d 3e 6e 61 20 29 20 6b 20 3d 20 30 3b 0a 20  p->na ) k = 0;. 
2ca70 20 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b 3b 0a 20   }.  p->i = k;. 
2ca80 20 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73 7a 3b 0a   p->nXor += sz;.
2ca90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
2caa0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2cab0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
2cac0 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d  LITE_OMIT_RANDOM
2cad0 4e 45 53 53 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NESS) */../*.** 
2cae0 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66  Write up to nBuf
2caf0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
2cb00 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a  ness into zBuf..
2cb10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2cb20 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  nRandomness(sqli
2cb30 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2cb40 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2cb50 42 75 66 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  Buf){.#if define
2cb60 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
2cb70 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
2cb80 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53  _OMIT_RANDOMNESS
2cb90 29 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ).  UNUSED_PARAM
2cba0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65  ETER(pVfs);.  me
2cbb0 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
2cbc0 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 42  uf);.  return nB
2cbd0 75 66 3b 0a 23 65 6c 73 65 0a 20 20 45 6e 74 72  uf;.#else.  Entr
2cbe0 6f 70 79 47 61 74 68 65 72 65 72 20 65 3b 0a 20  opyGatherer e;. 
2cbf0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2cc00 52 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65  R(pVfs);.  memse
2cc10 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
2cc20 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  ;.#if defined(_M
2cc30 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f  SC_VER) && _MSC_
2cc40 56 45 52 3e 3d 31 34 30 30 20 26 26 20 21 53 51  VER>=1400 && !SQ
2cc50 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
2cc60 72 61 6e 64 5f 73 28 28 75 6e 73 69 67 6e 65 64  rand_s((unsigned
2cc70 20 69 6e 74 2a 29 7a 42 75 66 29 3b 20 2f 2a 20   int*)zBuf); /* 
2cc80 72 61 6e 64 5f 73 28 29 20 69 73 20 6e 6f 74 20  rand_s() is not 
2cc90 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 4d  available with M
2cca0 69 6e 47 57 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  inGW */.#endif /
2ccb0 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  * defined(_MSC_V
2ccc0 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e  ER) && _MSC_VER>
2ccd0 3d 31 34 30 30 20 2a 2f 0a 20 20 65 2e 61 20 3d  =1400 */.  e.a =
2cce0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2ccf0 29 7a 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20  )zBuf;.  e.na = 
2cd00 6e 42 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d  nBuf;.  e.nXor =
2cd10 20 30 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20   0;.  e.i = 0;. 
2cd20 20 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d   {.    SYSTEMTIM
2cd30 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79  E x;.    osGetSy
2cd40 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
2cd50 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2cd60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2cd70 26 78 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45  &x, sizeof(SYSTE
2cd80 4d 54 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b  MTIME));.  }.  {
2cd90 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
2cda0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
2cdb0 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f  cessId();.    xo
2cdc0 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2cdd0 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64  igned char*)&pid
2cde0 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  , sizeof(DWORD))
2cdf0 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
2ce00 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20  _OS_WINRT.  {.  
2ce10 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20    ULONGLONG cnt 
2ce20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
2ce30 36 34 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  64();.    xorMem
2ce40 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2ce50 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69  d char*)&cnt, si
2ce60 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29  zeof(ULONGLONG))
2ce70 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  ;.  }.#else.  {.
2ce80 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
2ce90 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
2cea0 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2ceb0 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2cec0 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66  ar*)&cnt, sizeof
2ced0 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65  (DWORD));.  }.#e
2cee0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2cef0 53 5f 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20  S_WINRT */.  {. 
2cf00 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
2cf10 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
2cf20 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
2cf30 72 28 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65  r(&i);.    xorMe
2cf40 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e  mory(&e, (unsign
2cf50 65 64 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a  ed char*)&i, siz
2cf60 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
2cf70 52 29 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51  R));.  }.#if !SQ
2cf80 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2cf90 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2cfa0 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
2cfb0 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20  2_USE_UUID.  {. 
2cfc0 20 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20     UUID id;.    
2cfd0 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73  memset(&id, 0, s
2cfe0 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2cff0 20 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26    osUuidCreate(&
2d000 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  id);.    xorMemo
2d010 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2d020 20 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65   char*)&id, size
2d030 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d  of(UUID));.    m
2d040 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69  emset(&id, 0, si
2d050 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20  zeof(UUID));.   
2d060 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
2d070 75 65 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20  uential(&id);.  
2d080 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2d090 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2d0a0 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  &id, sizeof(UUID
2d0b0 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ));.  }.#endif /
2d0c0 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  * !SQLITE_OS_WIN
2d0d0 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
2d0e0 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
2d0f0 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20  _WIN32_USE_UUID 
2d100 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58  */.  return e.nX
2d110 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a  or>nBuf ? nBuf :
2d120 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20   e.nXor;.#endif 
2d130 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
2d140 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
2d150 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2d160 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a  ANDOMNESS) */.}.
2d170 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
2d180 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
2d190 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
2d1a0 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
2d1b0 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
2d1c0 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
2d1d0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2d1e0 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
2d1f0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
2d200 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
2d210 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
2d220 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2d230 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
2d240 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
2d250 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
2d260 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2d270 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2d280 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2d290 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2d2a0 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2d2b0 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2d2c0 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2d2d0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2d2e0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2d2f0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2d300 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2d310 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2d320 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2d330 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2d340 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2d350 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2d360 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2d370 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2d380 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2d390 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2d3a0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2d3b0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2d3c0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2d3d0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2d3e0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2d3f0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2d400 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2d410 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2d420 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2d430 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2d440 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2d450 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2d460 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2d470 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2d480 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2d490 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2d4a0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2d4b0 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2d4c0 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2d4d0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2d4e0 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2d4f0 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2d500 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2d510 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a  e time and date.
2d520 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
2d530 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2d540 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2d550 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
2d560 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
2d570 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2d580 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
2d590 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
2d5a0 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
2d5b0 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
2d5c0 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61  r of.     100-na
2d5d0 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
2d5e0 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
2d5f0 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
2d600 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a  305813.5)..  */.
2d610 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
2d620 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2d630 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
2d640 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
2d650 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
2d660 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2d670 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2d680 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
2d690 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2d6a0 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
2d6b0 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
2d6c0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
2d6d0 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
2d6e0 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
2d6f0 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
2d700 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
2d710 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2d720 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
2d730 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71  alue =.      (sq
2d740 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2d750 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
2d760 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
2d770 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
2d780 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
2d790 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
2d7a0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
2d7b0 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
2d7c0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2d7d0 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
2d7e0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2d7f0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
2d800 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
2d810 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
2d820 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
2d830 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
2d840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2d850 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
2d860 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2d870 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
2d880 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
2d890 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
2d8a0 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
2d8b0 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
2d8c0 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
2d8d0 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
2d8e0 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20  itValue) +.     
2d8f0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2d900 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
2d910 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
2d920 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
2d930 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2d940 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2d950 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2d960 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2d970 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2d980 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2d990 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2d9a0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2d9b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d9c0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2d9d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d9e0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2d9f0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2da00 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2da10 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2da20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
2da30 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2da40 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2da50 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
2da60 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
2da70 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2da80 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2da90 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2daa0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2dab0 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2dac0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2dad0 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
2dae0 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
2daf0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2db00 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
2db10 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
2db20 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
2db30 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
2db40 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2db50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2db60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2db70 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
2db80 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
2db90 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
2dba0 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
2dbb0 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
2dbc0 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
2dbd0 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
2dbe0 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
2dbf0 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
2dc00 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
2dc10 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
2dc20 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
2dc30 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2dc40 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
2dc50 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
2dc60 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
2dc70 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
2dc80 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
2dc90 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
2dca0 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
2dcb0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2dcc0 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
2dcd0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
2dce0 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
2dcf0 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
2dd00 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
2dd10 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
2dd20 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
2dd30 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2dd40 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
2dd50 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
2dd60 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
2dd70 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
2dd80 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
2dd90 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
2dda0 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
2ddb0 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
2ddc0 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
2ddd0 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
2dde0 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
2ddf0 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
2de00 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
2de10 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
2de20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
2de30 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
2de40 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
2de50 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
2de60 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
2de70 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
2de80 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
2de90 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
2dea0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
2deb0 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
2dec0 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
2ded0 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
2dee0 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
2def0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
2df00 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
2df10 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
2df20 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
2df30 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
2df40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2df50 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2df60 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
2df70 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
2df80 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
2df90 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
2dfa0 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
2dfb0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2dfc0 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
2dfd0 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
2dfe0 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
2dff0 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
2e000 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
2e010 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2e020 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
2e030 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
2e040 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
2e050 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
2e060 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
2e070 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
2e080 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2e090 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2e0a0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2e0b0 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
2e0c0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55  LastError();.  U
2e0d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2e0e0 70 56 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75  pVfs);.  if( nBu
2e0f0 66 3e 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74  f>0 ) winGetLast
2e100 45 72 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66  ErrorMsg(e, nBuf
2e110 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72  , zBuf);.  retur
2e120 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n e;.}../*.** In
2e130 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
2e140 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
2e150 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
2e160 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
2e170 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
2e180 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2e190 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2e1a0 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1c0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2e1d0 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
2e1e0 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20  File),       /* 
2e1f0 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
2e200 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
2e210 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
2e220 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
2e230 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2e240 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2e250 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
2e260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e270 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2e280 26 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20  &winAppData,    
2e290 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2e2a0 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2e2b0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2e2c0 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2e2d0 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2e2e0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
2e2f0 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
2e300 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
2e310 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
2e320 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
2e330 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75  me,       /* xFu
2e340 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
2e350 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
2e360 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
2e370 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
2e380 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
2e390 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2e3a0 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2e3c0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2e3d0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2e3e0 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2e3f0 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2e400 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  ness,         /*
2e410 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2e420 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2e430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2e440 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
2e450 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
2e460 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2e470 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
2e480 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
2e490 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
2e4a0 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
2e4b0 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20  entTimeInt64,   
2e4c0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
2e4d0 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
2e4e0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2e4f0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2e500 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2e510 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2e520 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2e530 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2e540 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2e550 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2e560 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69  mCall */.  };.#i
2e570 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2e580 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2e590 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2e5a0 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74  3_vfs winLongPat
2e5b0 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  hVfs = {.    3, 
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5d0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2e5e0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2e5f0 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a  nFile),       /*
2e600 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2e610 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
2e620 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2e630 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2e640 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2e650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2e660 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2e670 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 20  -longpath",     
2e680 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
2e690 20 26 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20   &winAppData,   
2e6a0 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2e6b0 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2e6c0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2e6d0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2e6e0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2e6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2e700 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2e710 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2e720 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2e730 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2e740 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46  ame,       /* xF
2e750 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2e760 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2e770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2e780 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2e790 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2e7a0 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2e7b0 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e7d0 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
2e7e0 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
2e7f0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2e800 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2e810 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  mness,         /
2e820 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2e830 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2e840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2e850 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2e860 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2e870 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2e880 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2e890 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2e8a0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2e8b0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2e8c0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20  rentTimeInt64,  
2e8d0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2e8e0 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2e8f0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2e900 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2e910 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2e920 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2e930 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
2e940 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2e950 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
2e960 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
2e970 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2e980 65 6e 64 69 66 0a 20 20 73 74 61 74 69 63 20 73  endif.  static s
2e990 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4e 6f  qlite3_vfs winNo
2e9a0 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20  lockVfs = {.    
2e9b0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2e9c0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2e9d0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2e9e0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20  (winFile),      
2e9f0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2ea00 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
2ea10 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2ea20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2ea30 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea50 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2ea60 6e 33 32 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 20  n32-none",      
2ea70 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2ea80 20 20 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70      &winNolockAp
2ea90 70 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 70 41  pData,     /* pA
2eaa0 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
2eab0 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
2eac0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2ead0 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2eaf0 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2eb00 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2eb10 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2eb20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2eb30 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  thname,       /*
2eb40 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2eb50 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb70 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2eb80 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2eb90 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2eba0 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2ebb0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
2ebc0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2ebd0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2ebe0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
2ebf0 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
2ec00 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
2ec10 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2ec20 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2ec30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ec40 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2ec50 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2ec60 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65         /* xCurre
2ec70 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2ec80 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2ec90 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2eca0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2ecb0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2ecc0 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  ,   /* xCurrentT
2ecd0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2ece0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2ecf0 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ,      /* xSetSy
2ed00 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2ed10 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2ed20 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ,      /* xGetSy
2ed30 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2ed40 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2ed50 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53  l,     /* xNextS
2ed60 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
2ed70 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
2ed80 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2ed90 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71  IDE).  static sq
2eda0 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e  lite3_vfs winLon
2edb0 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 20 3d  gPathNolockVfs =
2edc0 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ede0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
2edf0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
2ee00 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  ,       /* szOsF
2ee10 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2ee20 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
2ee30 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2ee40 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee60 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2ee70 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70      "win32-longp
2ee80 61 74 68 2d 6e 6f 6e 65 22 2c 20 2f 2a 20 7a 4e  ath-none", /* zN
2ee90 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e  ame */.    &winN
2eea0 6f 6c 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20  olockAppData,   
2eeb0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2eec0 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2eee0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2eef0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2ef00 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
2ef10 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ef30 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2ef40 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2ef50 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
2ef60 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
2ef70 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
2ef80 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2ef90 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2efa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2efb0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2efc0 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2efd0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2efe0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2eff0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
2f000 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2f010 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
2f020 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
2f030 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
2f040 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
2f050 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
2f060 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2f070 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  tTime,        /*
2f080 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
2f090 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
2f0a0 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78  rror,       /* x
2f0b0 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
2f0c0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2f0d0 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43  meInt64,   /* xC
2f0e0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2f0f0 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2f100 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
2f110 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2f120 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2f130 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
2f140 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2f150 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2f160 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a  stemCall,     /*
2f170 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
2f180 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a   */.  };.#endif.
2f190 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
2f1a0 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
2f1b0 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
2f1c0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
2f1d0 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
2f1e0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
2f1f0 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
2f200 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
2f210 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
2f220 6c 29 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20  l)==80 );..  /* 
2f230 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61  get memory map a
2f240 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c  llocation granul
2f250 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  arity */.  memse
2f260 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30  t(&winSysInfo, 0
2f270 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f  , sizeof(SYSTEM_
2f280 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49  INFO));.#if SQLI
2f290 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73  TE_OS_WINRT.  os
2f2a0 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
2f2b0 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
2f2c0 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  ;.#else.  osGetS
2f2d0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
2f2e0 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  sInfo);.#endif. 
2f2f0 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
2f300 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
2f310 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b  Granularity>0 );
2f320 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
2f330 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
2f340 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >0 );..  sqlite3
2f350 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
2f360 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20  inVfs, 1);..#if 
2f370 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2f380 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2f390 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
2f3a0 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61  ister(&winLongPa
2f3b0 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69  thVfs, 0);.#endi
2f3c0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  f..  sqlite3_vfs
2f3d0 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4e 6f  _register(&winNo
2f3e0 6c 6f 63 6b 56 66 73 2c 20 30 29 3b 0a 0a 23 69  lockVfs, 0);..#i
2f3f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2f400 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2f410 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
2f420 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67  egister(&winLong
2f430 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30  PathNolockVfs, 0
2f440 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
2f450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f460 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
2f470 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20  _end(void){.#if 
2f480 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2f490 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d    if( sleepObj!=
2f4a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c  NULL ){.    osCl
2f4b0 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f  oseHandle(sleepO
2f4c0 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62  bj);.    sleepOb
2f4d0 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65  j = NULL;.  }.#e
2f4e0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
2f4f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
2f500 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
2f510 57 49 4e 20 2a 2f 0a                             WIN */.