/ Hex Artifact Content
Login

Artifact b169437dff859e308b3726594094a2f8ca922941:


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 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
23f0: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
2400: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
2410: 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  e WINFILE_RDONLY
2420: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 20 20            0x02  
2430: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
2440: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2450: 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50  define WINFILE_P
2460: 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30  ERSIST_WAL     0
2470: 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74  x04   /* Persist
2480: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2490: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
24a0: 50 53 4f 57 20 20 20 20 20 20 20 20 20 20 20 20  PSOW            
24b0: 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45  0x10   /* SQLITE
24c0: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
24d0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f  _OVERWRITE */../
24e0: 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *. * The size of
24f0: 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64   the buffer used
2500: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   by sqlite3_win3
2510: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e  2_write_debug().
2520: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2530: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
2540: 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  F_SIZE.#  define
2550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
2560: 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69  G_BUF_SIZE   ((i
2570: 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28  nt)(4096-sizeof(
2580: 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a  DWORD))).#endif.
2590: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
25a0: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
25b0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
25c0: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
25d0: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
25e0: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 73  data directory s
25f0: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2600: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2610: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
2620: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
2630: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2640: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
2650: 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65  TORY_TYPE (1).#e
2660: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2670: 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20  value used with 
2680: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
2690: 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f  t_directory() to
26a0: 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a   specify that. *
26b0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
26c0: 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20  irectory should 
26d0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a  be changed.. */.
26e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
26f0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
2700: 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69  ORY_TYPE.#  defi
2710: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2720: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
2730: 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a  YPE (2).#endif..
2740: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
2750: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
2760: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
2770: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
2780: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
2790: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
27a0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
27b0: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
27c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
27d0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f  _WIN32_MALLOC../
27e0: 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69 73 20  *. * If this is 
27f0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f  non-zero, an iso
2800: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2810: 62 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  be created by th
2820: 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20  e native Win32. 
2830: 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73  * allocator subs
2840: 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65  ystem; otherwise
2850: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72  , the default pr
2860: 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20  ocess heap will 
2870: 62 65 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20  be used.  This. 
2880: 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f  * setting has no
2890: 20 65 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d   effect when com
28a0: 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54  piling for WinRT
28b0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
28c0: 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20  his is enabled. 
28d0: 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65  * and an isolate
28e0: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
28f0: 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20  reated to store 
2900: 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61  all allocated da
2910: 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ta.. *. ********
2920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2960: 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e  ******. * WARNIN
2970: 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  G: It is importa
2980: 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20  nt to note that 
2990: 77 68 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e  when this settin
29a0: 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  g is non-zero an
29b0: 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  d the. *        
29c0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
29d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
29e0: 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65  led (e.g. by the
29f0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2a00: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20 66 75  n. *          fu
2a10: 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74  nction), all dat
2a20: 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63  a that was alloc
2a30: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ated using the i
2a40: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2a50: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20 62 65  l. *          be
2a60: 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65   freed immediate
2a70: 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d  ly and any attem
2a80: 70 74 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79  pt to access any
2a90: 20 6f 66 20 74 68 61 74 20 66 72 65 65 64 0a 20   of that freed. 
2aa0: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
2ab0: 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74  will almost cert
2ac0: 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ainly result in 
2ad0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63  an immediate acc
2ae0: 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20  ess violation.. 
2af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2b40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2b60: 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ATE.#  define SQ
2b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2b80: 43 52 45 41 54 45 20 20 20 20 28 54 52 55 45 29  CREATE    (TRUE)
2b90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2ba0: 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a  his is cache siz
2bb0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61  e used in the ca
2bc0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  lculation of the
2bd0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
2be0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70   the. * Win32-sp
2bf0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74  ecific heap.  It
2c00: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74   cannot be negat
2c10: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ive.. */.#ifndef
2c20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41   SQLITE_WIN32_CA
2c30: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53  CHE_SIZE.#  if S
2c40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
2c50: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20  CHE_SIZE>=0.#   
2c60: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2c70: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
2c80: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2c90: 43 41 43 48 45 5f 53 49 5a 45 29 0a 23 20 20 65  CACHE_SIZE).#  e
2ca0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
2cb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43  SQLITE_WIN32_CAC
2cc0: 48 45 5f 53 49 5a 45 20 28 2d 28 53 51 4c 49 54  HE_SIZE (-(SQLIT
2cd0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
2ce0: 53 49 5a 45 29 29 0a 23 20 20 65 6e 64 69 66 0a  SIZE)).#  endif.
2cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2d00: 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f  e initial size o
2d10: 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63  f the Win32-spec
2d20: 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73  ific heap.  This
2d30: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
2d40: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
2d50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2d60: 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64  P_INIT_SIZE.#  d
2d70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2d80: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
2d90: 45 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  E ((SQLITE_WIN32
2da0: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
2db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2de0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2df0: 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65  E) + 4194304).#e
2e00: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2e10: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
2e20: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
2e30: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
2e40: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
2e50: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2e60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2e70: 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  MAX_SIZE.#  defi
2e80: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2e90: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28  HEAP_MAX_SIZE  (
2ea0: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  0).#endif../*. *
2eb0: 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73   The extra flags
2ec0: 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73   to use in calls
2ed0: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65   to the Win32 he
2ee0: 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76  ap APIs.  This v
2ef0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a  alue may be. * z
2f00: 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61  ero for the defa
2f10: 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a  ult behavior.. *
2f20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2f40: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
2f50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
2f60: 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64  AGS     (0).#end
2f70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  if.../*.** The w
2f80: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
2f90: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
2fa0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
2fb0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
2fc0: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
2fd0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
2fe0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
2ff0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
3000: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
3010: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
3020: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
3030: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
3040: 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69  agic1;   /* Magi
3050: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
3060: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
3070: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
3080: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
3090: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
30a0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
30b0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
30c0: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
30d0: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
30e0: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
30f0: 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66  own)? */.#ifndef
3100: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
3110: 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63  gic2;   /* Magic
3120: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
3130: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
3140: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
3150: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
3160: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
3170: 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30  MEM_MAGIC1     0
3180: 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e  x42b2830b.#defin
3190: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  e WINMEM_MAGIC2 
31a0: 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 23      0xbd4d7cf4.#
31b0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
31c0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
31d0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
31e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
31f0: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c    WINMEM_MAGIC1,
3200: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
3210: 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44  FALSE.#ifndef ND
3220: 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d  EBUG.  ,WINMEM_M
3230: 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a  AGIC2.#endif.};.
3240: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3250: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
3260: 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 73  sertMagic1() ass
3270: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
3280: 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  a.magic1==WINMEM
3290: 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e  _MAGIC1 ).#defin
32a0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
32b0: 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 77  gic2() assert( w
32c0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
32d0: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
32e0: 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  2 ).#define winM
32f0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
3300: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
3310: 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73  ic1(); winMemAss
3320: 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c  ertMagic2();.#el
3330: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
3340: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
3350: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
3360: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
3370: 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  )  &win_mem_data
3380: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
3390: 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 6e  etHeap()     win
33a0: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
33b0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
33c0: 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f  tOwned()    win_
33d0: 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a  mem_data.bOwned.
33e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
33f0: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
3400: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
3410: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
3420: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
3430: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
3440: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
3450: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
3460: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
3470: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
3480: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
3490: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
34a0: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
34b0: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
34c0: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
34d0: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
34e0: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
34f0: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
3500: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3510: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
3520: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
3530: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
3540: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
3550: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3560: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
3570: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
3580: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
3590: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
35a0: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
35b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
35c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
35d0: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
35e0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
35f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3600: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
3610: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
3620: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
3630: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
3640: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
3650: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
3660: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
3670: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
3680: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
3690: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
36a0: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
36b0: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
36c0: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
36d0: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
36e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e   SQLITE_TEST.LON
36f0: 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56  G SQLITE_WIN32_V
3700: 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f  OLATILE sqlite3_
3710: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
3720: 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53  se.static LONG S
3730: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
3740: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
3750: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
3760: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
3770: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
3780: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
3790: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
37a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
37c0: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
37d0: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
37e0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
37f0: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
3800: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
3810: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
3820: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
3830: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
3840: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
3850: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
3860: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
3870: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
3880: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
3890: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
38a0: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
38b0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
38c0: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
38d0: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
38e0: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
38f0: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
3900: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
3910: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
3920: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
3930: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
3940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
3950: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
3960: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3980: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3990: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
39a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
39b0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
39c0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
39d0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
39e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
39f0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3a00: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3a10: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3a20: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
3a30: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3a40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
3a50: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
3a60: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
3a70: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
3a80: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
3a90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3aa0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
3ab0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
3ac0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ae0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3af0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3b00: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
3b10: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
3b20: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
3b30: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
3b40: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
3b50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3b60: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3b70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3b80: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
3b90: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
3ba0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3bb0: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
3bc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3bd0: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
3be0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3bf0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3c20: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
3c30: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
3c40: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
3c50: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3c60: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3c70: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3c90: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3ca0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3cc0: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3ce0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3cf0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
3d00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3d10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3d20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3d30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3d40: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
3d50: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
3d60: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
3d70: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3d80: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3da0: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
3db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3dc0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
3dd0: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
3de0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3df0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
3e00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3e10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3e20: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3e30: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
3e40: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3e50: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3e70: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3e80: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
3e90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ea0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3eb0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ec0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3ed0: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
3ee0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3ef0: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
3f00: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
3f10: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3f20: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
3f30: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
3f40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3f50: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3f60: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3f70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3f80: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
3f90: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3fa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3fb0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3fc0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3fd0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
3fe0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3ff0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4020: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
4030: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
4040: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
4050: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4060: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
4070: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
4080: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
4090: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
40a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
40b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
40c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
40d0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
40e0: 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69  \.        (!defi
40f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4100: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4110: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20  AX_MMAP_SIZE>0) 
4120: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
4130: 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45  ITE_WIN32_CREATE
4140: 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b  FILEMAPPINGA.  {
4150: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
4160: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
4170: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
4180: 61 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20  appingA,      0 
4190: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
41a0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
41b0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
41c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41f0: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
4200: 6e 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngA ((HANDLE(WIN
4210: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
4220: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
4230: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
4240: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4250: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4260: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [6].pCurrent)..#
4270: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4280: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
4290: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
42a0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
42b0: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
42c0: 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65 64         (!defined
42d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
42e0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
42f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20  MMAP_SIZE>0)).  
4300: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
4310: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
4320: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
4330: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
4340: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
4350: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4360: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4370: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4380: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4390: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
43a0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
43b0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
43c0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
43d0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
43e0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
43f0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4400: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
4410: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
4420: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4430: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4450: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
4460: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
4470: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4480: 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20  CreateMutexW,   
4490: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
44a0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  lse.  { "CreateM
44b0: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
44c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
44f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
4500: 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c  teMutexW ((HANDL
4510: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
4520: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
4530: 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20  ,BOOL, \.       
4540: 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61   LPCWSTR))aSysca
4550: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
4560: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4580: 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  SI).  { "DeleteF
4590: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
45a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
45b0: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
45c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
45d0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
45e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
45f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4620: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4630: 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leA ((BOOL(WINAP
4640: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4650: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
4660: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4670: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4680: 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74  WIDE).  { "Delet
4690: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
46a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
46b0: 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  leteFileW,      
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46d0: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
46e0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
46f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4720: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
4730: 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  FileW ((BOOL(WIN
4740: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4750: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
4760: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
4770: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
4780: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
4790: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
47a0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
47b0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
47c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
47d0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
47e0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
47f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4800: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4810: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
4820: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
4830: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
4840: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
4850: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
4860: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
4870: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
4880: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4890: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
48a0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
48b0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
48c0: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
48d0: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
48e0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
48f0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
4900: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4930: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
4940: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
4950: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
4960: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
4970: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
4980: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
4990: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
49a0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
49b0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
49c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
49d0: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
49e0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
49f0: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
4a00: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
4a10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
4a20: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
4a30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4a40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4a50: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
4a60: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
4a70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a80: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
4a90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4aa0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
4ab0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
4ac0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4af0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
4b00: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
4b10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
4b20: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
4b30: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
4b40: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
4b50: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
4b60: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
4b70: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4b80: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4b90: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
4ba0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
4bb0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4bc0: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
4bd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4be0: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4bf0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
4c00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4c30: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
4c40: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
4c50: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
4c60: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
4c70: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
4c80: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
4c90: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  *))aSyscall[15].
4ca0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4cb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4cc0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4cd0: 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  ON).  { "FreeLib
4ce0: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4cf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65     (SYSCALL)Free
4d00: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20  Library,        
4d10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4d20: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4d30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4d40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4d70: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
4d80: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
4d90: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
4da0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
4db0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
4dc0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
4dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4de0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4df0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4e00: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
4e10: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
4e20: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
4e30: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
4e40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
4e60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4e70: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4e80: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
4e90: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
4ea0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
4eb0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
4ec0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4ed0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ee0: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4ef0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4f20: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4f30: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
4f40: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
4f50: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
4f60: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4f70: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4f80: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
4f90: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4fa0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4fb0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4fd0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4fe0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ff0: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
5000: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
5010: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
5020: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5030: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
5040: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5050: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5060: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5070: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5080: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
5090: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
50a0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
50b0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
50c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
50d0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
50e0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
50f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5100: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5110: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
5120: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
5130: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
5140: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
5150: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5160: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
5170: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
5180: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
51a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
51b0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
51c0: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
51d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
51e0: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
51f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5200: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5210: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5220: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5230: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5240: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
5250: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
5260: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
5270: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5280: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5290: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
52a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
52c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
52d0: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
52e0: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
52f0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
5300: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
5310: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5320: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5330: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
5340: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5350: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
5360: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
5370: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
5380: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5390: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
53a0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
53b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
53c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
53d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
53e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
53f0: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
5400: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
5410: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
5420: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
5430: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
5440: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
5450: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5460: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
5470: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
5480: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
5490: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
54a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
54b0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
54c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
54d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5500: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
5510: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
5520: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
5530: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
5540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5550: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5560: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
5570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5580: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
5590: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
55a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
55b0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
55c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
55d0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
55e0: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
55f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5620: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
5630: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
5640: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
5650: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
5660: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
5670: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
5680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5690: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
56a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
56b0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
56c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
56d0: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
56e0: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
56f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
5700: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
5710: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5720: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
5730: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
5740: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5770: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
5780: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
5790: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
57a0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
57b0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
57c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70  ))aSyscall[25].p
57d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
57e0: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
57f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5800: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
5810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5820: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
5830: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
5840: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5850: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
5860: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
5870: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5880: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5890: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
58a0: 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
58b0: 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
58c0: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
58d0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
58e0: 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22  ows CE. */.  { "
58f0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
5900: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
5910: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
5920: 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  sA,         0 },
5930: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
5940: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c  other Windows pl
5950: 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
5960: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
5970: 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
5980: 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61  ANSI string rega
5990: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
59a0: 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
59b0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
59c0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
59d0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
59e0: 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20  cAddress,       
59f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
5a00: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f  else.  { "GetPro
5a10: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5a20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5a50: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5a60: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
5a70: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
5a80: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
5a90: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
5aa0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
5ab0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5ac0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
5ad0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
5ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5af0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  GetSystemInfo,  
5b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b10: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
5b20: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
5b30: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5b60: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5b70: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
5b80: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
5b90: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
5ba0: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
5bb0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5bc0: 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ime",           
5bd0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
5be0: 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  emTime,         
5bf0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5c00: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20  osGetSystemTime 
5c10: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
5c20: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
5c30: 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72  yscall[29].pCurr
5c40: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5c50: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5c60: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5c70: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
5c80: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
5c90: 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  AsFileTime, 0 },
5ca0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
5cb0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5cc0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
5cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5ce0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5cf0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5d00: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5d10: 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  leTime ((VOID(WI
5d20: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5d30: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
5d40: 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72  yscall[30].pCurr
5d50: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5d60: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5d70: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
5d80: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
5d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5da0: 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20  )GetTempPathA,  
5db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5dc0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
5dd0: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5de0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5e10: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5e20: 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52  TempPathA ((DWOR
5e30: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5e40: 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c  ,LPSTR))aSyscall
5e50: 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [31].pCurrent)..
5e60: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5e70: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
5e80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5e90: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54  _WIDE).  { "GetT
5ea0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
5eb0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5ec0: 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20  etTempPathW,    
5ed0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5ee0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
5ef0: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5f00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5f40: 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28  mpPathW ((DWORD(
5f50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5f60: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
5f70: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
5f80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5f90: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
5fa0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
5fb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5fc0: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
5fd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5fe0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5ff0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
6000: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6030: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
6040: 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ount ((DWORD(WIN
6050: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
6060: 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e  call[33].pCurren
6070: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6080: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6090: 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45  _ANSI) && SQLITE
60a0: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
60b0: 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73  NEX.  { "GetVers
60c0: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
60d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56     (SYSCALL)GetV
60e0: 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20  ersionExA,      
60f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6100: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
6110: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
6120: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6150: 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69  efine osGetVersi
6160: 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e  onExA ((BOOL(WIN
6170: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6180: 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f   LPOSVERSIONINFO
6190: 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e  A))aSyscall[34].
61a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
61b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
61c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
61d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
61e0: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53  ) && \.        S
61f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
6200: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
6210: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
6220: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6230: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
6240: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6250: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
6260: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
6270: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
62a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
62b0: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
62c0: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
62d0: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
62e0: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
62f0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
6300: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
6330: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
6340: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6350: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
6360: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6370: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
6380: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6390: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
63a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
63b0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
63c0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
63d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
63e0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
63f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6400: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6410: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6420: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6450: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6460: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
6470: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
6480: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
6490: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
64a0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
64b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
64c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
64d0: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
64e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
64f0: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6500: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6510: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6520: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6530: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6560: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6570: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
6580: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
6590: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
65a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
65b0: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
65c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
65d0: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
65e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
65f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6600: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6610: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6620: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6630: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
6640: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
6650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6660: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
6670: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6680: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6690: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
66a0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
66b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
66c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
66d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
66e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
66f0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6710: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6730: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6740: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
6750: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6760: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6770: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6780: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
6790: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
67a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
67b0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
67d0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
67f0: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6800: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6810: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6840: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
6850: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
6860: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6870: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6880: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
6890: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
68c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
68d0: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
68e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
68f0: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6910: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6920: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6960: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6970: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
6980: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6990: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
69a0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
69b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
69c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
69d0: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
69e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
69f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6a00: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6a10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a20: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6a50: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
6a60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6aa0: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
6ab0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6ac0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
6ad0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
6ae0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6af0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6b00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6b10: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6b20: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6b30: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6b40: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6b50: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6b70: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
6b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6b90: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6ba0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
6bb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6be0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6bf0: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6c00: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6c10: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6c20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6c30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6c40: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
6c50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6c60: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
6c70: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
6c80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6c90: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6cb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6cd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6ce0: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
6cf0: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6d00: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6d10: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6d20: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6d30: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6d50: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6d60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6d70: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6da0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6de0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6df0: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6e00: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6e10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6e20: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6e30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6e40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6e50: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6e60: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6e70: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6e80: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6e90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ea0: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6eb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ec0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6ed0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6ee0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6f10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6f20: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6f30: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6f40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6f60: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6f70: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6f80: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6f90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6fa0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6fb0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6fc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6fd0: 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66   \.        (!def
6fe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ff0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7000: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
7010: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7020: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7030: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7040: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7050: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7060: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7070: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
7080: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
70a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
70b0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
70c0: 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  ile ((LPVOID(WIN
70d0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
70e0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
70f0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
7100: 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70  ))aSyscall[49].p
7110: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d  Current)..  { "M
7120: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
7130: 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ar",     (SYSCAL
7140: 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  L)MultiByteToWid
7150: 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a  eChar,     0 },.
7160: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69  .#define osMulti
7170: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28  ByteToWideChar (
7180: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
7190: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c  NT,DWORD,LPCSTR,
71a0: 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  int,LPWSTR, \.  
71b0: 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63        int))aSysc
71c0: 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74  all[50].pCurrent
71d0: 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72  )..  { "QueryPer
71e0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22  formanceCounter"
71f0: 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79  , (SYSCALL)Query
7200: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
7210: 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e  er, 0 },..#defin
7220: 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d  e osQueryPerform
7230: 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f  anceCounter ((BO
7240: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
7250: 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54         LARGE_INT
7260: 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  EGER*))aSyscall[
7270: 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  51].pCurrent).. 
7280: 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20   { "ReadFile",  
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
72a0: 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c  YSCALL)ReadFile,
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
72d0: 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ReadFile ((BOOL(
72e0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
72f0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  LPVOID,DWORD,LPD
7300: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7310: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7320: 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72  yscall[52].pCurr
7330: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e  ent)..  { "SetEn
7340: 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  dOfFile",       
7350: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7360: 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20  tEndOfFile,     
7370: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7380: 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46  fine osSetEndOfF
7390: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
73a0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
73b0: 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e  call[53].pCurren
73c0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
73d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
73e0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
73f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7400: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c  )SetFilePointer,
7410: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7420: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7430: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
7440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7470: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7480: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
7490: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
74a0: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
74b0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
74c0: 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43  )aSyscall[54].pC
74d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
74e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
74f0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7510: 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20  SCALL)Sleep,    
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7530: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
7540: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
7550: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7560: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7570: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7580: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7590: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
75a0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
75b0: 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72  Syscall[55].pCur
75c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
75d0: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
75e0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
75f0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7600: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
7610: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
7620: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
7630: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
7640: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
7650: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
7660: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
7670: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
7680: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7690: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
76a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f  _WINRT.  { "Unlo
76b0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
76c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
76d0: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
76e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
76f0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7700: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7710: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7740: 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63  .#ifndef osUnloc
7750: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
7760: 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  UnlockFile ((BOO
7770: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7780: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
7790: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
77a0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
77b0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
77c0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
77d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
77e0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
77f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7800: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
7810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7820: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
7830: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
7840: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7870: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
7880: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
7890: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
78a0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
78b0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
78c0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
78d0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
78e0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
78f0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66  OS_WINCE || !def
7900: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7910: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7920: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
7930: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7940: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7950: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7960: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7970: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7980: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
7990: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
79a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
79c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
79d0: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
79e0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
79f0: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
7a00: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
7a10: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
7a20: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
7a30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7a40: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7a50: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7a60: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7a70: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
7a80: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
7a90: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
7aa0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
7ab0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
7ac0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
7ad0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7ae0: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
7af0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7b00: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7b20: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
7b30: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7b40: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7b50: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7b60: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7b70: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7b80: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
7b90: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7ba0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7bb0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7bc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7bd0: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
7be0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7bf0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7c00: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
7c10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7c40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7c50: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7c60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7c70: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
7c80: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
7c90: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
7ca0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
7cb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7cc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7cd0: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7ce0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7cf0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7d00: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
7d10: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7d20: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7d30: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7d40: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7d60: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7d70: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7d80: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
7d90: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7da0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7db0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
7dc0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7dd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
7de0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7df0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7e00: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
7e10: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20  ingleObjectEx,  
7e20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7e30: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7e40: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
7e50: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7e70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7e80: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
7e90: 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52  eObjectEx ((DWOR
7ea0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7eb0: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
7ec0: 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c     BOOL))aSyscal
7ed0: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
7ee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7ef0: 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c  INRT.  { "SetFil
7f00: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
7f20: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20  FilePointerEx,  
7f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7f40: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7f50: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
7f60: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7f90: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
7fa0: 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c  PointerEx ((BOOL
7fb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7fc0: 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20  ,LARGE_INTEGER, 
7fd0: 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45  \.        PLARGE
7fe0: 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29  _INTEGER,DWORD))
7ff0: 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75  aSyscall[65].pCu
8000: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8010: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8020: 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  "GetFileInformat
8030: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20  ionByHandleEx", 
8040: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
8050: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
8060: 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73  dleEx, 0 },.#els
8070: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e  e.  { "GetFileIn
8080: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8090: 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  eEx", (SYSCALL)0
80a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
80c0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
80d0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
80e0: 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  ndleEx ((BOOL(WI
80f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
8100: 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e  .        FILE_IN
8110: 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41  FO_BY_HANDLE_CLA
8120: 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29  SS,LPVOID,DWORD)
8130: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
8140: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8150: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8160: 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  (!defined(SQLITE
8170: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
8180: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
8190: 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56 69  ZE>0).  { "MapVi
81a0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
81b0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
81c0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
81d0: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
81e0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
81f0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
8200: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8230: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
8240: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
8250: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
8260: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
8270: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
8280: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
8290: 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[67].pCurrent).
82a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
82b0: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
82c0: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
82d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
82e0: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
82f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8300: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
8310: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
8320: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8350: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
8360: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
8370: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
8380: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
8390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
83a0: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
83b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
83c0: 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72  Syscall[68].pCur
83d0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
83e0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
83f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8400: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
8410: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  N).  { "LoadPack
8420: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
8430: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
8440: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
8450: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8460: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
8470: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
8480: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
84b0: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
84c0: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
84d0: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
84e0: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
84f0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
8500: 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [69].pCurrent)..
8510: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8520: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
8530: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
8540: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
8550: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
8560: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8570: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
8580: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
8590: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
85c0: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
85d0: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
85e0: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
85f0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70  ))aSyscall[70].p
8600: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
8610: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
8620: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
8630: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
8640: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
8650: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
8660: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8670: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8680: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
8690: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
86a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
86b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
86c0: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
86d0: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
86e0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
86f0: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
8700: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
8710: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
8720: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8730: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
8740: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8750: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8760: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
8770: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
8780: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
8790: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
87a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
87b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
87c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
87d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
87e0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
87f0: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
8800: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
8810: 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[72].pCurrent)
8820: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
8830: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
8840: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
8850: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8860: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
8870: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
8880: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8890: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
88a0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
88b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
88e0: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
88f0: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
8900: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
8910: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33  STR))aSyscall[73
8920: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
8930: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
8940: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8950: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
8960: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
8970: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
8980: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
8990: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
89a0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34  OID))aSyscall[74
89b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
89c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
89d0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
89e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
89f0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
8a00: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43  P_SIZE>0).  { "C
8a10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8a20: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
8a30: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
8a40: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
8a50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
8a60: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8a70: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8a80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8a90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8aa0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8ab0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8ac0: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
8ad0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
8ae0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
8af0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
8b00: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
8b10: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
8b20: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
8b30: 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e  ../*.** NOTE: On
8b40: 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f   some sub-platfo
8b50: 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f  rms, the Interlo
8b60: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8b70: 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a  nge "function".*
8b80: 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c  *       is reall
8b90: 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74  y just a macro t
8ba0: 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69  hat uses a compi
8bb0: 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65  ler intrinsic (e
8bc0: 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20  .g. x64)..**    
8bd0: 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79     So do not try
8be0: 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73   to make this is
8bf0: 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61   into a redefina
8c00: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ble interface..*
8c10: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e  /.#if defined(In
8c20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8c30: 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49  Exchange).  { "I
8c40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8c50: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8c80: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8c90: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8ca0: 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65  hange Interlocke
8cb0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8cc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65  .#else.  { "Inte
8cd0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8ce0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
8cf0: 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  L)InterlockedCom
8d00: 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20  pareExchange, 0 
8d10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8d20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8d30: 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28  Exchange ((LONG(
8d40: 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a  WINAPI*)(LONG \.
8d50: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
8d60: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20  IN32_VOLATILE*, 
8d70: 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63  LONG,LONG))aSysc
8d80: 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74  all[76].pCurrent
8d90: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ).#endif /* defi
8da0: 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43  ned(InterlockedC
8db0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 20  ompareExchange) 
8dc0: 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
8dd0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
8de0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8df0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
8e00: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43  _UUID.  { "UuidC
8e10: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
8e20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
8e30: 75 69 64 43 72 65 61 74 65 2c 20 20 20 20 20 20  uidCreate,      
8e40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
8e50: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  e.  { "UuidCreat
8e60: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
8e70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8ea0: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72  #define osUuidCr
8eb0: 65 61 74 65 20 28 28 52 50 43 5f 53 54 41 54 55  eate ((RPC_STATU
8ec0: 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55  S(RPC_ENTRY*)(UU
8ed0: 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 37  ID*))aSyscall[77
8ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8ef0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
8f00: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
8f10: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
8f20: 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20  WIN32_USE_UUID. 
8f30: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65   { "UuidCreateSe
8f40: 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28  quential",     (
8f50: 53 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61  SYSCALL)UuidCrea
8f60: 74 65 53 65 71 75 65 6e 74 69 61 6c 2c 20 20 20  teSequential,   
8f70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8f80: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
8f90: 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53 43  tial",     (SYSC
8fa0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8fc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8fd0: 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
8fe0: 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20 20  uential \.      
8ff0: 20 20 28 28 52 50 43 5f 53 54 41 54 55 53 28 52    ((RPC_STATUS(R
9000: 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a  PC_ENTRY*)(UUID*
9010: 29 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70  ))aSyscall[78].p
9020: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
9030: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
9040: 5f 53 59 4e 43 29 20 26 26 20 53 51 4c 49 54 45  _SYNC) && SQLITE
9050: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
9060: 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f  .  { "FlushViewO
9070: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
9080: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 56   (SYSCALL)FlushV
9090: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
90a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
90b0: 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c   "FlushViewOfFil
90c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  e",          (SY
90d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
90f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
9100: 6e 65 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66  ne osFlushViewOf
9110: 46 69 6c 65 20 5c 0a 20 20 20 20 20 20 20 20 28  File \.        (
9120: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
9130: 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61  PCVOID,SIZE_T))a
9140: 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72  Syscall[79].pCur
9150: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
9160: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
9170: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
9180: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
9190: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
91a0: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
91b0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
91c0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
91d0: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
91e0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
91f0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
9200: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
9210: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
9220: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
9230: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
9240: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
9250: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
9260: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
9270: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
9280: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
9290: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
92a0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
92c0: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
92d0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
92e0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
92f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
9300: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
9310: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
9320: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
9330: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
9340: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
9350: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
9360: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9370: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
9380: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
9390: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
93a0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
93b0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
93c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
93d0: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
93e0: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
93f0: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
9400: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
9410: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
9420: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
9430: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
9440: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
9450: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
9460: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
9470: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
9480: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
9490: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
94a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
94b0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
94c0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
94d0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
94e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
94f0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
9500: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
9510: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
9520: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
9530: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
9540: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9550: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9560: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
9570: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
9580: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9590: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
95a0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
95b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
95c0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
95d0: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
95e0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
95f0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
9600: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9610: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
9620: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9630: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
9640: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
9650: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
9660: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
9670: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
9680: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
9690: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
96a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
96b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
96c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
96d0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
96e0: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
96f0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
9700: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
9710: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
9720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
9730: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
9740: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
9750: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
9760: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
9770: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
9780: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
9790: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
97a0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
97b0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
97c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
97d0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
97e0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
97f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9800: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
9810: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
9820: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9830: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9840: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
9850: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9860: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9870: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
9880: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
9890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
98a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
98b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
98c0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
98d0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
98e0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
98f0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9900: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9910: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9920: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9930: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9940: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9950: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
9960: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
9970: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9980: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
99a0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
99b0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
99c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
99d0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
99e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
99f0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9a00: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9a10: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9a20: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9a30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9a40: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9a50: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9a60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9a70: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9a80: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9a90: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
9aa0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
9ab0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9ac0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9ad0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9ae0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9af0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9b00: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9b10: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9b20: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9b30: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9b40: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9b50: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
9b60: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
9b70: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9b80: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9b90: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
9ba0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
9bb0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9bc0: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9bd0: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9be0: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9bf0: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9c00: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9c10: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
9c20: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
9c30: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
9c40: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
9c50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
9c60: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
9c70: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9c80: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
9c90: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
9ca0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
9cb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9cc0: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9cd0: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9ce0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9cf0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9d00: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9d10: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9d20: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9d30: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9d40: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9d50: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9d60: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9d80: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9d90: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9da0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9db0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9dc0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9dd0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9df0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9e00: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9e10: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
9e20: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
9e30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9e40: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
9e50: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
9e60: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9e70: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
9e80: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
9e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9ea0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9eb0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9ec0: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9ed0: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9f00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9f10: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
9f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9f30: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9f40: 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20  _ERROR, "failed 
9f50: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
9f60: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
9f90: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
9fa0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
9fb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9fc0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71  }.  }.#else.  sq
9fd0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9fe0: 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c  _NOTFOUND, "fail
9ff0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
a000: 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  t, heap=%p",.   
a010: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
a020: 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d  *)hHeap);.  rc =
a030: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
a040: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
a050: 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61  nLargest ) *pnLa
a060: 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74  rgest = nLargest
a070: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  ../*.** If a Win
a090: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
a0a0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a0b0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
a0c0: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
a0d0: 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64  o.** destroy and
a0e0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20 49   recreate it.  I
a0f0: 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  f the Win32 nati
a100: 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69  ve heap is not i
a110: 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a  solated and/or.*
a120: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65  * the sqlite3_me
a130: 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63  mory_used() func
a140: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
a150: 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54  turn zero, SQLIT
a160: 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62  E_BUSY will.** b
a170: 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  e returned and n
a180: 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  o changes will b
a190: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69  e made to the Wi
a1a0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e  n32 native heap.
a1b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a1c0: 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70  win32_reset_heap
a1d0: 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  (){.  int rc;.  
a1e0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
a1f0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
a200: 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61  ter; ) /* The ma
a210: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
a220: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
a230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
a240: 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54  *pMem; )    /* T
a250: 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63  he memsys static
a260: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a270: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
a280: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
a290: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
a2a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
a2b0: 52 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f  R); ).  MUTEX_LO
a2c0: 47 49 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69  GIC( pMem = sqli
a2d0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
a2e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
a2f0: 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71  TIC_MEM); ).  sq
a300: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a310: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71  r(pMaster);.  sq
a320: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a330: 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65  r(pMem);.  winMe
a340: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
a350: 20 20 69 66 28 20 77 69 6e 4d 65 6d 47 65 74 48    if( winMemGetH
a360: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77  eap()!=NULL && w
a370: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
a380: 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  && sqlite3_memor
a390: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20  y_used()==0 ){. 
a3a0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20     /*.    ** At 
a3b0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 72  this point, ther
a3c0: 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f  e should be no o
a3d0: 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72  utstanding memor
a3e0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e  y allocations on
a3f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 65 61 70  .    ** the heap
a400: 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62  .  Also, since b
a410: 6f 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 61  oth the master a
a420: 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20  nd memsys locks 
a430: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
a440: 20 20 2a 2a 20 62 65 69 6e 67 20 68 65 6c 64 20    ** being held 
a450: 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20  by us, no other 
a460: 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66  function (i.e. f
a470: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65  rom another thre
a480: 61 64 29 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a  ad) should.    *
a490: 2a 20 62 65 20 61 62 6c 65 20 74 6f 20 65 76 65  * be able to eve
a4a0: 6e 20 61 63 63 65 73 73 20 74 68 65 20 68 65 61  n access the hea
a4b0: 70 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 64  p.  Attempt to d
a4c0: 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65  estroy and recre
a4d0: 61 74 65 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69  ate our.    ** i
a4e0: 73 6f 6c 61 74 65 64 20 57 69 6e 33 32 20 6e 61  solated Win32 na
a4f0: 74 69 76 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20  tive heap now.. 
a500: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
a510: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a520: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
a530: 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74  ssert( winMemGet
a540: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
a550: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a560: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
a570: 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75  );.    winMemShu
a580: 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44  tdown(winMemGetD
a590: 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61  ataPtr());.    a
a5a0: 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74  ssert( winMemGet
a5b0: 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a  Heap()==NULL );.
a5c0: 20 20 20 20 61 73 73 65 72 74 28 20 21 77 69 6e      assert( !win
a5d0: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b  MemGetOwned() );
a5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
a5f0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a600: 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ()==0 );.    rc 
a610: 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e  = winMemInit(win
a620: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
a630: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
a640: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77  !=SQLITE_OK || w
a650: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
a660: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
a670: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
a680: 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77  K || winMemGetOw
a690: 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73  ned() );.    ass
a6a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a6b0: 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65  OK || sqlite3_me
a6c0: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
a6d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a6e0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 57 69 6e  *.    ** The Win
a6f0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 63  32 native heap c
a700: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
a710: 64 20 62 65 63 61 75 73 65 20 69 74 20 6d 61 79  d because it may
a720: 20 62 65 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   be in use..    
a730: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
a740: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73  TE_BUSY;.  }.  s
a750: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a760: 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  ve(pMem);.  sqli
a770: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a780: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
a790: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
a7a0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
a7b0: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
a7c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
a7d0: 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69  utputs the speci
a7e0: 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69  fied (ANSI) stri
a7f0: 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  ng to the Win32 
a800: 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20  debugger.** (if 
a810: 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a  available)..*/..
a820: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
a830: 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63  32_write_debug(c
a840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c  onst char *zBuf,
a850: 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68   int nBuf){.  ch
a860: 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54  ar zDbgBuf[SQLIT
a870: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a880: 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69  SIZE];.  int nMi
a890: 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53  n = MIN(nBuf, (S
a8a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a8b0: 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20  BUF_SIZE - 1)); 
a8c0: 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69  /* may be negati
a8d0: 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69  ve. */.  if( nMi
a8e0: 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31  n<-1 ) nMin = -1
a8f0: 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76  ; /* all negativ
a900: 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20  e values become 
a910: 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  -1. */.  assert(
a920: 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69   nMin==-1 || nMi
a930: 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c  n==0 || nMin<SQL
a940: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
a950: 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 64 65 66  F_SIZE );.#ifdef
a960: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
a970: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
a980: 7a 42 75 66 20 29 7b 0a 20 20 20 20 28 76 6f 69  zBuf ){.    (voi
a990: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
a9a0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
a9b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
a9c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a9d0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
a9e0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
a9f0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
aa00: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
aa10: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
aa20: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
aa30: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
aa40: 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  n);.    osOutput
aa50: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62  DebugStringA(zDb
aa60: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
aa70: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
aa80: 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a  gStringA(zBuf);.
aa90: 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65    }.#elif define
aaa0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
aab0: 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65  AS_WIDE).  memse
aac0: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
aad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
aae0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28  UF_SIZE);.  if (
aaf0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
ab00: 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20  deChar(.        
ab10: 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41    osAreFileApisA
ab20: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
ab30: 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42   CP_OEMCP, 0, zB
ab40: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d  uf,.          nM
ab50: 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67  in, (LPWSTR)zDbg
ab60: 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  Buf, SQLITE_WIN3
ab70: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73  2_DBG_BUF_SIZE/s
ab80: 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30  izeof(WCHAR))<=0
ab90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
aba0: 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65    }.  osOutputDe
abb0: 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57  bugStringW((LPCW
abc0: 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65  STR)zDbgBuf);.#e
abd0: 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  lse.  if( nMin>0
abe0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
abf0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
ac00: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
ac10: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
ac20: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
ac30: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69   nMin);.    fpri
ac40: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
ac50: 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  , zDbgBuf);.  }e
ac60: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
ac70: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
ac80: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Buf);.  }.#endif
ac90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
aca0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
acb0: 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72  suspends the cur
acc0: 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20  rent thread for 
acd0: 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d  at least ms.** m
ace0: 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68  illiseconds.  Th
acf0: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
ad00: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c   to the Win32 Sl
ad10: 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e  eep() interface.
ad20: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
ad30: 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48  S_WINRT.static H
ad40: 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d  ANDLE sleepObj =
ad50: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76   NULL;.#endif..v
ad60: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
ad70: 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69  2_sleep(DWORD mi
ad80: 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  lliseconds){.#if
ad90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
ada0: 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a  .  if ( sleepObj
adb0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c  ==NULL ){.    sl
adc0: 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74  eepObj = osCreat
add0: 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20  eEventExW(NULL, 
ade0: 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45  NULL, CREATE_EVE
adf0: 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c  NT_MANUAL_RESET,
ae00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20   SYNCHRONIZE);. 
ae30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65   }.  assert( sle
ae40: 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20  epObj!=NULL );. 
ae50: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
ae60: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
ae70: 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  j, milliseconds,
ae80: 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20   FALSE);.#else. 
ae90: 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65   osSleep(millise
aea0: 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  conds);.#endif.}
aeb0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
aec0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
aed0: 30 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  0 && !SQLITE_OS_
aee0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
aef0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a 20  _OS_WINRT && \. 
af00: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 48         SQLITE_TH
af10: 52 45 41 44 53 41 46 45 3e 30 0a 44 57 4f 52 44  READSAFE>0.DWORD
af20: 20 73 71 6c 69 74 65 33 57 69 6e 33 32 57 61 69   sqlite3Win32Wai
af30: 74 28 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  t(HANDLE hObject
af40: 29 7b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20  ){.  DWORD rc;. 
af50: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 6f 73   while( (rc = os
af60: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
af70: 65 63 74 45 78 28 68 4f 62 6a 65 63 74 2c 20 49  ectEx(hObject, I
af80: 4e 46 49 4e 49 54 45 2c 0a 20 20 20 20 20 20 20  NFINITE,.       
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 20 20 20 20 20 20                  
afb0: 54 52 55 45 29 29 3d 3d 57 41 49 54 5f 49 4f 5f  TRUE))==WAIT_IO_
afc0: 43 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20  COMPLETION ){}. 
afd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
afe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
aff0: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
b000: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
b010: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
b020: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
b030: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
b040: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
b050: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
b060: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
b070: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
b080: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
b090: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
b0a0: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
b0b0: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
b0c0: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
b0d0: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
b0e0: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
b0f0: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
b100: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
b110: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
b120: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69   when running Wi
b130: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
b140: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
b150: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
b160: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
b170: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
b180: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
b190: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
b1a0: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
b1b0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
b1c0: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
b1d0: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
b1e0: 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20  () API..*/..#if 
b1f0: 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  !SQLITE_WIN32_GE
b200: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66  TVERSIONEX.# def
b210: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
b220: 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f  ).#elif SQLITE_O
b230: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
b240: 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64  E_OS_WINRT || !d
b250: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b260: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20  N32_HAS_ANSI).# 
b270: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b280: 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69   (1).#elif !defi
b290: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b2a0: 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66  _HAS_WIDE).# def
b2b0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30  ine osIsNT()  (0
b2c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
b2d0: 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c   osIsNT()  ((sql
b2e0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29  ite3_os_type==2)
b2f0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   || sqlite3_win3
b300: 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69  2_is_nt()).#endi
b310: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
b320: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
b330: 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65  s if the machine
b340: 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65   is running a ve
b350: 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73  rsion of Windows
b360: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
b370: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69   NT kernel..*/.i
b380: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
b390: 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69  _is_nt(void){.#i
b3a0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b3b0: 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  T.  /*.  ** NOTE
b3c0: 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d  : The WinRT sub-
b3d0: 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61  platform is alwa
b3e0: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
b3f0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
b400: 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e  .  **       kern
b410: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  el..  */.  retur
b420: 6e 20 31 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54  n 1;.#elif SQLIT
b430: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
b440: 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73 49 6e 74  ONEX.  if( osInt
b450: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
b460: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
b470: 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20 30 29 3d  _os_type, 0, 0)=
b480: 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
b490: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
b4a0: 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 4f 53 56  AS_ANSI).    OSV
b4b0: 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66  ERSIONINFOA sInf
b4c0: 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f  o;.    sInfo.dwO
b4d0: 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65  SVersionInfoSize
b4e0: 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29   = sizeof(sInfo)
b4f0: 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73 69  ;.    osGetVersi
b500: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
b510: 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64     osInterlocked
b520: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28  CompareExchange(
b530: 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
b540: 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66 6f  ,.        (sInfo
b550: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d  .dwPlatformId ==
b560: 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49   VER_PLATFORM_WI
b570: 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c  N32_NT) ? 2 : 1,
b580: 20 30 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e   0);.#elif defin
b590: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b5a0: 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 4f 53  HAS_WIDE).    OS
b5b0: 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e  VERSIONINFOW sIn
b5c0: 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77  fo;.    sInfo.dw
b5d0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
b5e0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
b5f0: 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73  );.    osGetVers
b600: 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a  ionExW(&sInfo);.
b610: 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65      osInterlocke
b620: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
b630: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
b640: 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66  e,.        (sInf
b650: 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d  o.dwPlatformId =
b660: 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57  = VER_PLATFORM_W
b670: 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31  IN32_NT) ? 2 : 1
b680: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
b690: 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65  .  return osInte
b6a0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b6b0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b6c0: 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d  os_type, 2, 2)==
b6d0: 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  2;.#elif SQLITE_
b6e0: 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20 6f 73  TEST.  return os
b6f0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
b700: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
b710: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20  te3_os_type, 2, 
b720: 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a 20 20 2f  2)==2;.#else.  /
b730: 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c  *.  ** NOTE: All
b740: 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73 20 77   sub-platforms w
b750: 68 65 72 65 20 74 68 65 20 47 65 74 56 65 72 73  here the GetVers
b760: 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74 69  ionEx[AW] functi
b770: 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 20 20 20  ons are.  **    
b780: 20 20 20 64 65 70 72 65 63 61 74 65 64 20 61 72     deprecated ar
b790: 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 64  e always assumed
b7a0: 20 74 6f 20 62 65 20 62 61 73 65 64 20 6f 6e 20   to be based on 
b7b0: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20  the NT kernel.. 
b7c0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
b7d0: 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 64 65 66  #endif.}..#ifdef
b7e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
b7f0: 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  LLOC./*.** Alloc
b800: 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65  ate nBytes of me
b810: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
b820: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
b830: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  oc(int nBytes){.
b840: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
b850: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
b860: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
b870: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
b880: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
b890: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
b8a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
b8b0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
b8c0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
b8d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b8e0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
b8f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b900: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
b910: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
b920: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
b930: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b940: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
b950: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
b960: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d  ytes>=0 );.  p =
b970: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
b980: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b990: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
b9a0: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
b9b0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
b9c0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b9d0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
b9e0: 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20  to HeapAlloc %u 
b9f0: 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61  bytes (%lu), hea
ba00: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
ba10: 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f         nBytes, o
ba20: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
ba30: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
ba40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
ba50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
ba60: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
ba70: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
ba80: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20  void *pPrior){. 
ba90: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
baa0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bab0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bac0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bae0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
baf0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bb00: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bb10: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bb20: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bb30: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bb40: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
bb50: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
bb60: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
bb70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bb80: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
bb90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
bba0: 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  !pPrior ) return
bbb0: 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c  ; /* Passing NUL
bbc0: 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73  L to HeapFree is
bbd0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20   undefined. */. 
bbe0: 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65   if( !osHeapFree
bbf0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
bc00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bc10: 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20   pPrior) ){.    
bc20: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bc30: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
bc40: 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c  d to HeapFree bl
bc50: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
bc60: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
bc70: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
bc80: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
bc90: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
bca0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
bcb0: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
bcc0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
bcd0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
bce0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
bcf0: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
bd00: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
bd10: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
bd20: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
bd30: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
bd40: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
bd50: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
bd60: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
bd70: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bd80: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
bd90: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bda0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
bdb0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
bdc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bdd0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
bde0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
bdf0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
be00: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
be10: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
be20: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
be30: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
be40: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
be50: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
be60: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
be70: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
be80: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
be90: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
bea0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
beb0: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
bec0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bed0: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
bee0: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
bef0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
bf00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
bf10: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
bf20: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
bf30: 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68  u bytes (%lu), h
bf40: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
bf50: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
bf60: 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20  ? "HeapReAlloc" 
bf70: 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e  : "HeapAlloc", n
bf80: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
bf90: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
bfa0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
bfb0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
bfc0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
bfd0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
bfe0: 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   of an outstandi
bff0: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  ng allocation, i
c000: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
c010: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
c020: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41  e(void *p){.  HA
c030: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49  NDLE hHeap;.  SI
c040: 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65  ZE_T n;..  winMe
c050: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
c060: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
c070: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
c080: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
c090: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
c0a0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
c0b0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
c0c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
c0d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
c0e0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
c0f0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
c100: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
c110: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
c120: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
c130: 20 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20   p) );.#endif.  
c140: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
c150: 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53  0;.  n = osHeapS
c160: 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ize(hHeap, SQLIT
c170: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c180: 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d  GS, p);.  if( n=
c190: 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20  =(SIZE_T)-1 ){. 
c1a0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c1b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
c1c0: 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65  iled to HeapSize
c1d0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
c1e0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c1f0: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73             p, os
c200: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
c210: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
c220: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c230: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
c240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
c250: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
c260: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
c270: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
c280: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
c290: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
c2a0: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
c2b0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
c2c0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
c2d0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
c2e0: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
c2f0: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
c300: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
c310: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
c320: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
c330: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
c340: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
c350: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c360: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
c370: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57  mData->magic1==W
c380: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a  INMEM_MAGIC1 );.
c390: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
c3a0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57  mData->magic2==W
c3b0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a  INMEM_MAGIC2 );.
c3c0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
c3d0: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
c3e0: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
c3f0: 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  E.  if( !pWinMem
c400: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
c410: 20 20 20 44 57 4f 52 44 20 64 77 49 6e 69 74 69     DWORD dwIniti
c420: 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  alSize = SQLITE_
c430: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
c440: 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44 20  SIZE;.    DWORD 
c450: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
c460: 28 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47 6c  (DWORD)sqlite3Gl
c470: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
c480: 3b 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78 69  ;.    if( dwMaxi
c490: 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  mumSize==0 ){.  
c4a0: 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a      dwMaximumSiz
c4b0: 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  e = SQLITE_WIN32
c4c0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a  _HEAP_MAX_SIZE;.
c4d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 77      }else if( dw
c4e0: 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61  InitialSize>dwMa
c4f0: 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20  ximumSize ){.   
c500: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
c510: 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65   = dwMaximumSize
c520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
c530: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
c540: 20 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51   osHeapCreate(SQ
c550: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c560: 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 49               dwI
c590: 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61  nitialSize, dwMa
c5a0: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
c5b0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c5c0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20  ->hHeap ){.     
c5d0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c5e0: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
c5f0: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
c600: 48 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29  HeapCreate (%lu)
c610: 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74  , flags=%u, init
c620: 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a  Size=%lu, maxSiz
c630: 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20  e=%lu",.        
c640: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
c650: 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (), SQLITE_WIN32
c660: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77 49  _HEAP_FLAGS, dwI
c670: 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20  nitialSize,.    
c680: 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53        dwMaximumS
c690: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
c6a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c6b0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
c6c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c6d0: 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ned = TRUE;.    
c6e0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
c6f0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20  ata->bOwned );. 
c700: 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d   }.#else.  pWinM
c710: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
c720: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
c730: 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  ();.  if( !pWinM
c740: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
c750: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
c760: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
c770: 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74         "failed t
c780: 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  o GetProcessHeap
c790: 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61   (%lu)", osGetLa
c7a0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
c7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c7c0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
c7d0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c7e0: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61  ned = FALSE;.  a
c7f0: 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44  ssert( !pWinMemD
c800: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23  ata->bOwned );.#
c810: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
c820: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c830: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
c840: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c850: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
c860: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
c870: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c880: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
c890: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
c8a0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
c8b0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
c8c0: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
c8d0: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
c8e0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c8f0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
c900: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
c910: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c920: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  Deinitialize thi
c930: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
c940: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
c950: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
c960: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
c970: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
c980: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
c990: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
c9a0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c9b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
c9c0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c9d0: 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  ->magic1==WINMEM
c9e0: 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73  _MAGIC1 );.  ass
c9f0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
ca00: 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  ->magic2==WINMEM
ca10: 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20 69 66  _MAGIC2 );..  if
ca20: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
ca30: 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  Heap ){.    asse
ca40: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
ca50: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
ca60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
ca70: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
ca80: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
ca90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
caa0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
cab0: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
cac0: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
cad0: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
cae0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
caf0: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
cb00: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57  endif.    if( pW
cb10: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
cb20: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  d ){.      if( !
cb30: 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57  osHeapDestroy(pW
cb40: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cb50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
cb60: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
cb70: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
cb80: 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25  o HeapDestroy (%
cb90: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
cbc0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e  r(), (void*)pWin
cbd0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b  MemData->hHeap);
cbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cbf0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
cc00: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
cc10: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
cc20: 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b  a->hHeap = NULL;
cc30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
cc40: 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c  pulate the low-l
cc50: 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  evel memory allo
cc60: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  cation function 
cc70: 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73  pointers in.** s
cc80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
cc90: 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65  ig.m with pointe
cca0: 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e  rs to the routin
ccb0: 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  es in this file.
ccc0: 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   The.** argument
ccd0: 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62 6c  s specify the bl
cce0: 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
ccf0: 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   manage..**.** T
cd00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
cd10: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
cd20: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20  lite3_config(), 
cd30: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a  and therefore.**
cd40: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
cd50: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
cd60: 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a  e (it is not)..*
cd70: 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
cd80: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
cd90: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
cda0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
cdb0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
cdc0: 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d  m_methods winMem
cdd0: 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20  Methods = {.    
cde0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20  winMemMalloc,.  
cdf0: 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20    winMemFree,.  
ce00: 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c    winMemRealloc,
ce10: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c  .    winMemSize,
ce20: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64  .    winMemRound
ce30: 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e  up,.    winMemIn
ce40: 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68  it,.    winMemSh
ce50: 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e  utdown,.    &win
ce60: 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20  _mem_data.  };. 
ce70: 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d   return &winMemM
ce80: 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20  ethods;.}..void 
ce90: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
cea0: 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71  ault(void){.  sq
ceb0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
cec0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
ced0: 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  C, sqlite3MemGet
cee0: 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64  Win32());.}.#end
cef0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
cf00: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
cf10: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
cf20: 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  F-8 string to Mi
cf30: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2e  crosoft Unicode.
cf40: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
cf50: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
cf60: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cf70: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
cf80: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
cf90: 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e  tatic LPWSTR win
cfa0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f  Utf8ToUnicode(co
cfb0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29  nst char *zText)
cfc0: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
cfd0: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 54 65 78   LPWSTR zWideTex
cfe0: 74 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73  t;..  nChar = os
cff0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
d000: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
d010: 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  zText, -1, NULL,
d020: 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
d030: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d040: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
d050: 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  Text = sqlite3Ma
d060: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a  llocZero( nChar*
d070: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b  sizeof(WCHAR) );
d080: 0a 20 20 69 66 28 20 7a 57 69 64 65 54 65 78 74  .  if( zWideText
d090: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d0a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72  n 0;.  }.  nChar
d0b0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
d0c0: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
d0d0: 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  , 0, zText, -1, 
d0e0: 7a 57 69 64 65 54 65 78 74 2c 0a 20 20 20 20 20  zWideText,.     
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
d110: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
d120: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d130: 5f 66 72 65 65 28 7a 57 69 64 65 54 65 78 74 29  _free(zWideText)
d140: 3b 0a 20 20 20 20 7a 57 69 64 65 54 65 78 74 20  ;.    zWideText 
d150: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
d160: 6e 20 7a 57 69 64 65 54 65 78 74 3b 0a 7d 0a 0a  n zWideText;.}..
d170: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
d180: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
d190: 65 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  e string to UTF-
d1a0: 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  8..**.** Space t
d1b0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
d1c0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
d1d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
d1e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
d1f0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
d200: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c  nUnicodeToUtf8(L
d210: 50 43 57 53 54 52 20 7a 57 69 64 65 54 65 78 74  PCWSTR zWideText
d220: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
d230: 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 0a    char *zText;..
d240: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
d250: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
d260: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
d270: 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c  eText, -1, 0, 0,
d280: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d290: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d2a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d2b0: 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d  zText = sqlite3M
d2c0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
d2d0: 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d   );.  if( zText=
d2e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d2f0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
d300: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d310: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
d320: 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d   0, zWideText, -
d330: 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79 74 65 2c  1, zText, nByte,
d340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d370: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d380: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
d390: 78 74 29 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d  xt);.    zText =
d3a0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
d3b0: 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zText;.}../*.**
d3c0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49   Convert an ANSI
d3d0: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
d3e0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 75 73  soft Unicode, us
d3f0: 69 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20  ing the ANSI or 
d400: 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20 70 61 67 65  OEM.** code page
d410: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
d420: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
d430: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
d440: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
d450: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
d460: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69  static LPWSTR wi
d470: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63  nMbcsToUnicode(c
d480: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
d490: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
d4a0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
d4b0: 50 57 53 54 52 20 7a 4d 62 63 73 54 65 78 74 3b  PWSTR zMbcsText;
d4c0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
d4d0: 3d 20 75 73 65 41 6e 73 69 20 3f 20 43 50 5f 41  = useAnsi ? CP_A
d4e0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
d4f0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
d500: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d510: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 54 65  codepage, 0, zTe
d520: 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20  xt, -1, NULL,.  
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
d550: 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a  *sizeof(WCHAR);.
d560: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
d570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d580: 20 20 7d 0a 20 20 7a 4d 62 63 73 54 65 78 74 20    }.  zMbcsText 
d590: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
d5a0: 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
d5b0: 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 69 66  f(WCHAR) );.  if
d5c0: 28 20 7a 4d 62 63 73 54 65 78 74 3d 3d 30 20 29  ( zMbcsText==0 )
d5d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d5e0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d5f0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
d600: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
d610: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 4d 62 63   zText, -1, zMbc
d620: 73 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  sText,.         
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20         nByte);. 
d650: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
d660: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d670: 65 28 7a 4d 62 63 73 54 65 78 74 29 3b 0a 20 20  e(zMbcsText);.  
d680: 20 20 7a 4d 62 63 73 54 65 78 74 20 3d 20 30 3b    zMbcsText = 0;
d690: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
d6a0: 62 63 73 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  bcsText;.}../*.*
d6b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72  * Convert a Micr
d6c0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74  osoft Unicode st
d6d0: 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c 74 69 2d  ring to a multi-
d6e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
d6f0: 74 72 69 6e 67 2c 0a 2a 2a 20 75 73 69 6e 67 20  tring,.** using 
d700: 74 68 65 20 41 4e 53 49 20 6f 72 20 4f 45 4d 20  the ANSI or OEM 
d710: 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  code page..**.**
d720: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d730: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d740: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d750: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d760: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
d770: 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65  char *winUnicode
d780: 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a  ToMbcs(LPCWSTR z
d790: 57 69 64 65 54 65 78 74 2c 20 69 6e 74 20 75 73  WideText, int us
d7a0: 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20 6e 42  eAnsi){.  int nB
d7b0: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65  yte;.  char *zTe
d7c0: 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  xt;.  int codepa
d7d0: 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20 43  ge = useAnsi ? C
d7e0: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
d7f0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
d800: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
d810: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
d820: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30  zWideText, -1, 0
d830: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
d840: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d850: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d860: 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69  }.  zText = sqli
d870: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
d880: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54  Byte );.  if( zT
d890: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d8a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
d8b0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d8c0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
d8d0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54 65  page, 0, zWideTe
d8e0: 78 74 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 0a 20  xt, -1, zText,. 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d910: 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Byte, 0, 0);.  i
d920: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
d930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d940: 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54  e(zText);.    zT
d950: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
d960: 65 74 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a  eturn zText;.}..
d970: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
d980: 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61  multi-byte chara
d990: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
d9a0: 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  TF-8..**.** Spac
d9b0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d9c0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d9d0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d9e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
da00: 2a 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 63  *winMbcsToUtf8(c
da10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
da20: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
da30: 20 20 63 68 61 72 20 2a 7a 54 65 78 74 55 74 66    char *zTextUtf
da40: 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  8;.  LPWSTR zTmp
da50: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
da60: 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69  e = winMbcsToUni
da70: 63 6f 64 65 28 7a 54 65 78 74 2c 20 75 73 65 41  code(zText, useA
da80: 6e 73 69 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  nsi);.  if( zTmp
da90: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
daa0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
dab0: 54 65 78 74 55 74 66 38 20 3d 20 77 69 6e 55 6e  TextUtf8 = winUn
dac0: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
dad0: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
dae0: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
daf0: 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 55  .  return zTextU
db00: 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tf8;.}../*.** Co
db10: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
db20: 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c 74 69 2d  ring to a multi-
db30: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
db40: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  tring..**.** Spa
db50: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
db60: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
db70: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
db80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
db90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
dba0: 20 2a 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28   *winUtf8ToMbcs(
dbb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
dbc0: 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b  t, int useAnsi){
dbd0: 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 4d 62  .  char *zTextMb
dbe0: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
dbf0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
dc00: 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  de = winUtf8ToUn
dc10: 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a 20 20  icode(zText);.  
dc20: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
dc30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
dc40: 0a 20 20 7d 0a 20 20 7a 54 65 78 74 4d 62 63 73  .  }.  zTextMbcs
dc50: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d   = winUnicodeToM
dc60: 62 63 73 28 7a 54 6d 70 57 69 64 65 2c 20 75 73  bcs(zTmpWide, us
dc70: 65 41 6e 73 69 29 3b 0a 20 20 73 71 6c 69 74 65  eAnsi);.  sqlite
dc80: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
dc90: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74  ;.  return zText
dca0: 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Mbcs;.}../*.** T
dcb0: 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20  his is a public 
dcc0: 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20  wrapper for the 
dcd0: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
dce0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
dcf0: 4c 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77  LPWSTR sqlite3_w
dd00: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  in32_utf8_to_uni
dd10: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
dd20: 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20  *zText){.#ifdef 
dd30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
dd40: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
dd50: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
dd60: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
dd70: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
dd80: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
dd90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dda0: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
ddb0: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
ddc0: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
ddd0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
dde0: 72 6e 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  rn winUtf8ToUnic
ddf0: 6f 64 65 28 7a 54 65 78 74 29 3b 0a 7d 0a 0a 2f  ode(zText);.}../
de00: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
de10: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
de20: 72 20 74 68 65 20 77 69 6e 55 6e 69 63 6f 64 65  r the winUnicode
de30: 54 6f 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f  ToUtf8() functio
de40: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
de50: 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64  te3_win32_unicod
de60: 65 5f 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54  e_to_utf8(LPCWST
de70: 52 20 7a 57 69 64 65 54 65 78 74 29 7b 0a 23 69  R zWideText){.#i
de80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
de90: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
dea0: 66 28 20 21 7a 57 69 64 65 54 65 78 74 20 29 7b  f( !zWideText ){
deb0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
dec0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
ded0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dee0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
def0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
df00: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
df10: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
df20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
df30: 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55  if.  return winU
df40: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
df50: 64 65 54 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  deText);.}../*.*
df60: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
df70: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
df80: 68 65 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  he winMbcsToUtf8
df90: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
dfa0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
dfb0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
dfc0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
dfd0: 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt){.#ifdef SQLI
dfe0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
dff0: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
e000: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e010: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e030: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e050: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e070: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e080: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e090: 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54 65  inMbcsToUtf8(zTe
e0a0: 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69  xt, osAreFileApi
e0b0: 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a  sANSI());.}../*.
e0c0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62  ** This is a pub
e0d0: 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20  lic wrapper for 
e0e0: 74 68 65 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  the winMbcsToUtf
e0f0: 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  8() function..*/
e100: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
e110: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
e120: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
e130: 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41  *zText, int useA
e140: 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nsi){.#ifdef SQL
e150: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e160: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78  RMOR.  if( !zTex
e170: 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  t ){.    (void)S
e180: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e190: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e1a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
e1b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e1c0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
e1d0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e1e0: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
e1f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e200: 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54  winMbcsToUtf8(zT
e210: 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 7d  ext, useAnsi);.}
e220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e230: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72  a public wrapper
e240: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66 38   for the winUtf8
e250: 54 6f 4d 62 63 73 28 29 20 66 75 6e 63 74 69 6f  ToMbcs() functio
e260: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
e270: 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
e280: 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61  o_mbcs(const cha
e290: 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 65  r *zText){.#ifde
e2a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e2b0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
e2c0: 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76  !zText ){.    (v
e2d0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
e2e0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
e2f0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
e300: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e310: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
e320: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  if( sqlite3_init
e330: 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72  ialize() ) retur
e340: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  n 0;.#endif.  re
e350: 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 4d 62  turn winUtf8ToMb
e360: 63 73 28 7a 54 65 78 74 2c 20 6f 73 41 72 65 46  cs(zText, osAreF
e370: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
e380: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e390: 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65   a public wrappe
e3a0: 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66  r for the winUtf
e3b0: 38 54 6f 4d 62 63 73 28 29 20 66 75 6e 63 74 69  8ToMbcs() functi
e3c0: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
e3d0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
e3e0: 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73 74  to_mbcs_v2(const
e3f0: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
e400: 74 20 75 73 65 41 6e 73 69 29 7b 0a 23 69 66 64  t useAnsi){.#ifd
e410: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e420: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e430: 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28   !zText ){.    (
e440: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e450: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e460: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
e470: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e480: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
e490: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
e4a0: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
e4b0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
e4c0: 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 4d  eturn winUtf8ToM
e4d0: 62 63 73 28 7a 54 65 78 74 2c 20 75 73 65 41 6e  bcs(zText, useAn
e4e0: 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  si);.}../*.** Th
e4f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
e500: 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
e510: 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f  ory or the tempo
e520: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62  rary directory b
e530: 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  ased on.** the p
e540: 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74  rovided argument
e550: 73 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67  s.  The type arg
e560: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20  ument must be 1 
e570: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
e580: 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65  the.** data dire
e590: 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72  ctory or 2 in or
e5a0: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74  der to set the t
e5b0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
e5c0: 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a  ry.  The zValue.
e5d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ** argument is t
e5e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
e5f0: 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e  irectory to use.
e600: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
e610: 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51  ue will be.** SQ
e620: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
e630: 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssful..*/.int sq
e640: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
e650: 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20  directory(DWORD 
e660: 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56  type, LPCWSTR zV
e670: 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a  alue){.  char **
e680: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  ppDirectory = 0;
e690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e6a0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
e6b0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
e6c0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
e6d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e6e0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
e6f0: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
e700: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
e710: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
e720: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
e730: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
e740: 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69  ctory;.  }else i
e750: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
e760: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
e770: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
e780: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
e790: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
e7a0: 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73  ectory;.  }.  as
e7b0: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
e7c0: 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49  ry || type==SQLI
e7d0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
e7e0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20  RECTORY_TYPE.   
e7f0: 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d         || type==
e800: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
e810: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
e820: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
e830: 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20  !ppDirectory || 
e840: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48  sqlite3MemdebugH
e850: 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74  asType(*ppDirect
e860: 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41  ory, MEMTYPE_HEA
e870: 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69  P) );.  if( ppDi
e880: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63  rectory ){.    c
e890: 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20  har *zValueUtf8 
e8a0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  = 0;.    if( zVa
e8b0: 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d  lue && zValue[0]
e8c0: 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65   ){.      zValue
e8d0: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
e8e0: 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b  eToUtf8(zValue);
e8f0: 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c  .      if ( zVal
e900: 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20  ueUtf8==0 ){.   
e910: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e920: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
e930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e940: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
e950: 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  pDirectory);.   
e960: 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20   *ppDirectory = 
e970: 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20  zValueUtf8;.    
e980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e990: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e9a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
e9b0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
e9c0: 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74   value of winGet
e9d0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20  LastErrorMsg.** 
e9e0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
e9f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
ea00: 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
ea10: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
ea20: 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
ea30: 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
ea40: 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61  uncated)..*/.sta
ea50: 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
ea60: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
ea70: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
ea80: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
ea90: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
eaa0: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
eab0: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
eac0: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
ead0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
eae0: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
eaf0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
eb00: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
eb10: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
eb20: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
eb30: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
eb40: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
eb50: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
eb60: 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
eb70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
eb80: 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a  INRT.    WCHAR z
eb90: 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f  TempWide[SQLITE_
eba0: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
ebb0: 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64  _CHARS+1];.    d
ebc0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
ebd0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
ebe0: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
ebf0: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
ec20: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
ec30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
ec50: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69           zTempWi
ecc0: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
ecf0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a  X_ERRMSG_CHARS,.
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
ed20: 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54  .#else.    LPWST
ed30: 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55  R zTempWide = NU
ed40: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    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: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
ed80: 7c 0a 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 20 20 20 20 46                 F
eda0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
edb0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
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 20 20 46 4f 52 4d 41 54 5f           FORMAT_
ede0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
edf0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
ee40: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
ee90: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20    0);.#endif.   
eee0: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
eef0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
ef00: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
ef10: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
ef20: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
ef30: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
ef40: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
ef50: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
ef60: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
ef70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
ef80: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
ef90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
efa0: 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72  INRT.      /* fr
efb0: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
efc0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
efd0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
efe0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
eff0: 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b  Free(zTempWide);
f000: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f010: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
f020: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
f030: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
f040: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
f050: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
f060: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
f070: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
f080: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
f0b0: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
f0c0: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
f0f0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
f100: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
f190: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
f1e0: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
f1f0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
f200: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
f210: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
f220: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
f230: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
f240: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
f250: 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28  = winMbcsToUtf8(
f260: 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c 65  zTemp, osAreFile
f270: 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20  ApisANSI());.   
f280: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
f290: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
f2a0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
f2b0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
f2c0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
f2d0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
f2e0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
f2f0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  mp);.    }.  }.#
f300: 65 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d  endif.  if( 0 ==
f310: 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71   dwLen ){.    sq
f320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
f330: 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72  Buf, zBuf, "OsEr
f340: 72 6f 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22  ror 0x%lx (%lu)"
f350: 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73  , lastErrno, las
f360: 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65  tErrno);.  }else
f370: 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20  {.    /* copy a 
f380: 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20  maximum of nBuf 
f390: 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20  chars to output 
f3a0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
f3b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
f3c0: 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Buf, zBuf, "%s",
f3d0: 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66   zOut);.    /* f
f3e0: 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66  ree the UTF8 buf
f3f0: 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fer */.    sqlit
f400: 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
f410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f420: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ../*.**.** This 
f430: 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f  function - winLo
f440: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d  gErrorAtLine() -
f450: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
f460: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
f470: 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f  ro.** winLogErro
f480: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  r()..**.** This 
f490: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
f4a0: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
f4b0: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
f4c0: 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  S function..** I
f4d0: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
f4e0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
f4f0: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
f500: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
f510: 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  e of.** error co
f520: 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  de and, if possi
f530: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
f540: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
f550: 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61  nt from.** Forma
f560: 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  tMessage..**.** 
f570: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
f580: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
f590: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
f5a0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
f5b0: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
f5c0: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
f5d0: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
f5e0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
f5f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a  LITE_CANTOPEN)..
f600: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
f610: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
f620: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
f630: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
f640: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
f650: 69 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73 73  iled and the ass
f660: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
f670: 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79  tem path, if any
f680: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ..*/.#define win
f690: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64  LogError(a,b,c,d
f6a0: 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  )   winLogErrorA
f6b0: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f  tLine(a,b,c,d,__
f6c0: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
f6d0: 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74  nt winLogErrorAt
f6e0: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
f6f0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
f700: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
f710: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
f720: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
f730: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
f740: 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20    /* Win32 last 
f750: 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  error */.  const
f760: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20   char *zFunc,   
f770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
f780: 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f  me of OS functio
f790: 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f  n that failed */
f7a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f7b0: 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
f7c0: 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20     /* File path 
f7d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f7e0: 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  error */.  int i
f7f0: 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Line            
f800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
f810: 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  urce line number
f820: 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63   where error occ
f830: 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68  urred */.){.  ch
f840: 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20  ar zMsg[500];   
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f860: 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
f870: 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20  error text */.  
f880: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f8b0: 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20  */..  zMsg[0] = 
f8c0: 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45  0;.  winGetLastE
f8d0: 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e  rrorMsg(lastErrn
f8e0: 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c  o, sizeof(zMsg),
f8f0: 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74   zMsg);.  assert
f900: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
f910: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
f920: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
f930: 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   "";.  for(i=0; 
f940: 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b  zMsg[i] && zMsg[
f950: 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67  i]!='\r' && zMsg
f960: 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b  [i]!='\n'; i++){
f970: 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b  }.  zMsg[i] = 0;
f980: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
f990: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
f9a0: 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75  s_win.c:%d: (%lu
f9b0: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
f9c0: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73        iLine, las
f9d0: 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  tErrno, zFunc, z
f9e0: 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a  Path, zMsg.  );.
f9f0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
fa00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
fa10: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
fa20: 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28  that a ReadFile(
fa30: 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20  ), WriteFile(), 
fa40: 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29  and DeleteFile()
fa50: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72  .** will be retr
fa60: 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ied following a 
fa70: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20  locking error - 
fa80: 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20  probably caused 
fa90: 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20  by.** antivirus 
faa0: 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20  software.  Also 
fab0: 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61  the initial dela
fac0: 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  y before the fir
fad0: 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65  st retry..** The
fae0: 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73   delay increases
faf0: 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65   linearly with e
fb00: 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69  ach retry..*/.#i
fb10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
fb20: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23  32_IOERR_RETRY.#
fb30: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
fb40: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
fb50: 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   10.#endif.#ifnd
fb60: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
fb70: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
fb80: 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
fb90: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
fba0: 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e  TRY_DELAY 25.#en
fbb0: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77  dif.static int w
fbc0: 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53  inIoerrRetry = S
fbd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
fbe0: 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20  R_RETRY;.static 
fbf0: 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72  int winIoerrRetr
fc00: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
fc10: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
fc20: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
fc30: 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  The "winIoerrCan
fc40: 52 65 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73  Retry1" macro is
fc50: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
fc60: 6e 65 20 69 66 20 61 20 70 61 72 74 69 63 75 6c  ne if a particul
fc70: 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20  ar I/O.** error 
fc80: 63 6f 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69  code obtained vi
fc90: 61 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  a GetLastError()
fca0: 20 69 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20   is eligible to 
fcb0: 62 65 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a  be retried.  It.
fcc0: 2a 2a 20 6d 75 73 74 20 61 63 63 65 70 74 20 74  ** must accept t
fcd0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57  he error code DW
fce0: 4f 52 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20  ORD as its only 
fcf0: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f  argument and sho
fd00: 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  uld return.** no
fd10: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  n-zero if the er
fd20: 72 6f 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e  ror code is tran
fd30: 73 69 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20  sient in nature 
fd40: 61 6e 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f  and the operatio
fd50: 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  n.** responsible
fd60: 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
fd70: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72  the original err
fd80: 6f 72 20 6d 69 67 68 74 20 73 75 63 63 65 65 64  or might succeed
fd90: 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72   upon being.** r
fda0: 65 74 72 69 65 64 2e 20 20 54 68 65 20 61 72 67  etried.  The arg
fdb0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61  ument to this ma
fdc0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20  cro should be a 
fdd0: 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  variable..**.** 
fde0: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20  Additionally, a 
fdf0: 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e  macro named "win
fe00: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
fe10: 6d 61 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20  may be defined. 
fe20: 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66   If it.** is def
fe30: 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  ined, it will be
fe40: 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20   consulted only 
fe50: 77 68 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22  when the macro "
fe60: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
fe70: 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65  1".** returns ze
fe80: 72 6f 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65  ro.  The "winIoe
fe90: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63  rrCanRetry2" mac
fea0: 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ro is completely
feb0: 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a   optional and.**
fec0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
fed0: 69 6e 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e  include addition
fee0: 61 6c 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69  al error codes i
fef0: 6e 20 74 68 65 20 73 65 74 20 74 68 61 74 20 73  n the set that s
ff00: 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20  hould.** result 
ff10: 69 6e 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49  in the failing I
ff20: 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69  /O operation bei
ff30: 6e 67 20 72 65 74 72 69 65 64 20 62 79 20 74 68  ng retried by th
ff40: 65 20 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a  e caller.  If.**
ff50: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77   defined, the "w
ff60: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
ff70: 22 20 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68  " macro must exh
ff80: 69 62 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65  ibit external se
ff90: 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74  mantics.** ident
ffa0: 69 63 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66  ical to those of
ffb0: 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   the "winIoerrCa
ffc0: 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a  nRetry1" macro..
ffd0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
ffe0: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
fff0: 31 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f  1).#define winIo
10000 65 72 72 43 61 6e 52 65 74 72 79 31 28 61 29 20  errCanRetry1(a) 
10010 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43  (((a)==ERROR_ACC
10020 45 53 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20  ESS_DENIED)     
10030 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
10060 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  R_SHARING_VIOLAT
10070 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20  ION)    || \.   
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
100a0 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c  =ERROR_LOCK_VIOL
100b0 41 54 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20  ATION)       || 
100c0 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f  ((a)==ERROR_DEV_
100f0 4e 4f 54 5f 45 58 49 53 54 29 20 20 20 20 20 20  NOT_EXIST)      
10100 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20    || \.         
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52       ((a)==ERROR
10130 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44  _NETNAME_DELETED
10140 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20  )      || \.    
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
10170 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55  ERROR_SEM_TIMEOU
10180 54 29 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c  T)          || \
10190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
101b0 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f  (a)==ERROR_NETWO
101c0 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29  RK_UNREACHABLE))
101d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
101e0 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f  f a ReadFile() o
101f0 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72  r WriteFile() er
10200 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f  ror occurs, invo
10210 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
10220 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ** to see if it 
10230 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65  should be retrie
10240 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  d.  Return TRUE 
10250 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72  to retry.  Retur
10260 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69  n FALSE.** to gi
10270 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72  ve up with an er
10280 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
10290 6e 74 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  nt winRetryIoerr
102a0 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44  (int *pnRetry, D
102b0 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20  WORD *pError){. 
102c0 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
102d0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
102e0 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e  f( *pnRetry>=win
102f0 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
10300 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
10310 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
10320 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
10330 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
10340 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72   winIoerrCanRetr
10350 79 31 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  y1(e) ){.    sql
10360 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
10370 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65  (winIoerrRetryDe
10380 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
10390 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
103a0 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
103b0 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
103c0 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  (winIoerrCanRetr
103d0 79 32 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77  y2).  else if( w
103e0 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
103f0 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
10400 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
10410 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
10420 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
10430 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
10440 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10450 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
10460 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70  pError ){.    *p
10470 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20  Error = e;.  }. 
10480 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10490 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72  .** Log a I/O er
104a0 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64  ror retry episod
104b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
104c0 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e  d winLogIoerr(in
104d0 74 20 6e 52 65 74 72 79 2c 20 69 6e 74 20 6c 69  t nRetry, int li
104e0 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65  neno){.  if( nRe
104f0 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
10500 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
10510 54 49 43 45 2c 0a 20 20 20 20 20 20 22 64 65 6c  TICE,.      "del
10520 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f  ayed %dms for lo
10530 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c  ck/sharing confl
10540 69 63 74 20 61 74 20 6c 69 6e 65 20 25 64 22 2c  ict at line %d",
10550 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52  .      winIoerrR
10560 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
10570 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c  *(nRetry+1)/2, l
10580 69 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  ineno.    );.  }
10590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 23  .}../*.** This #
105a0 69 66 20 64 6f 65 73 20 6e 6f 74 20 72 65 6c 79  if does not rely
105b0 20 6f 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   on the SQLITE_O
105c0 53 5f 57 49 4e 43 45 20 64 65 66 69 6e 65 20 62  S_WINCE define b
105d0 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f  ecause the.** co
105e0 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 65 63 74  rresponding sect
105f0 69 6f 6e 20 69 6e 20 22 64 61 74 65 2e 63 22 20  ion in "date.c" 
10600 63 61 6e 6e 6f 74 20 75 73 65 20 69 74 2e 0a 2a  cannot use it..*
10610 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
10620 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c  QLITE_OMIT_LOCAL
10630 54 49 4d 45 29 20 26 26 20 64 65 66 69 6e 65 64  TIME) && defined
10640 28 5f 57 49 4e 33 32 5f 57 43 45 29 20 26 26 20  (_WIN32_WCE) && 
10650 5c 0a 20 20 20 20 28 21 64 65 66 69 6e 65 64 28  \.    (!defined(
10660 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41  SQLITE_MSVC_LOCA
10670 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53  LTIME_API) || !S
10680 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
10690 54 49 4d 45 5f 41 50 49 29 0a 2f 2a 0a 2a 2a 20  TIME_API)./*.** 
106a0 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20  The MSVC CRT on 
106b0 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e  Windows CE may n
106c0 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74  ot have a localt
106d0 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ime() function..
106e0 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 61 20 73  ** So define a s
106f0 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 20  ubstitute..*/.# 
10700 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68   include <time.h
10710 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63  >.struct tm *__c
10720 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63  decl localtime(c
10730 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a  onst time_t *t).
10740 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
10750 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49  t tm y;.  FILETI
10760 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53  ME uTm, lTm;.  S
10770 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20  YSTEMTIME pTm;. 
10780 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
10790 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a  64;.  t64 = *t;.
107a0 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31    t64 = (t64 + 1
107b0 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30  1644473600)*1000
107c0 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f  0000;.  uTm.dwLo
107d0 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f  wDateTime = (DWO
107e0 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46  RD)(t64 & 0xFFFF
107f0 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48  FFFF);.  uTm.dwH
10800 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57  ighDateTime= (DW
10810 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b  ORD)(t64 >> 32);
10820 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c  .  osFileTimeToL
10830 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
10840 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c  m,&lTm);.  osFil
10850 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
10860 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20  e(&lTm,&pTm);.  
10870 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e  y.tm_year = pTm.
10880 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20  wYear - 1900;.  
10890 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77  y.tm_mon = pTm.w
108a0 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74  Month - 1;.  y.t
108b0 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_wday = pTm.wDa
108c0 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f  yOfWeek;.  y.tm_
108d0 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b  mday = pTm.wDay;
108e0 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70  .  y.tm_hour = p
108f0 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d  Tm.wHour;.  y.tm
10900 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75  _min = pTm.wMinu
10910 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d  te;.  y.tm_sec =
10920 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20   pTm.wSecond;.  
10930 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e  return &y;.}.#en
10940 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
10950 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a  OS_WINCE./******
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74  ***.** This sect
109b0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ion contains cod
109c0 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79  e for WinCE only
109d0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 48 41 4e  ..*/.#define HAN
109e0 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
109f0 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
10a00 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66  har*)a)[-(int)of
10a10 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
10a20 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
10a30 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
10a40 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
10a50 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
10a60 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
10a70 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
10a80 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
10a90 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74    dwErr = osWait
10aa0 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
10ab0 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20  h, INFINITE);.  
10ac0 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20   } while (dwErr 
10ad0 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  != WAIT_OBJECT_0
10ae0 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49   && dwErr != WAI
10af0 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a  T_ABANDONED);.}.
10b00 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
10b10 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79  lock acquired by
10b20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
10b30 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  re().*/.#define 
10b40 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
10b50 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65  e(h) ReleaseMute
10b60 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  x(h)../*.** Crea
10b70 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  te the mutex and
10b80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75   shared memory u
10b90 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
10ba0 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64  in the file.** d
10bb0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a  escriptor pFile.
10bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
10bd0 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f  nceCreateLock(co
10be0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
10bf0 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46  ame, winFile *pF
10c00 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a  ile){.  LPWSTR z
10c10 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e  Tok;.  LPWSTR zN
10c20 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ame;.  DWORD las
10c30 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62  tErrno;.  BOOL b
10c40 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a  Logged = FALSE;.
10c50 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54    BOOL bInit = T
10c60 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  RUE;..  zName = 
10c70 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
10c80 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
10c90 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
10ca0 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d     /* out of mem
10cb0 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ory */.    retur
10cc0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
10cd0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
10ce0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
10cf0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61  the local lockda
10d00 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ta */.  memset(&
10d10 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c  pFile->local, 0,
10d20 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c   sizeof(pFile->l
10d30 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  ocal));..  /* Re
10d40 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c  place the backsl
10d50 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66  ashes from the f
10d60 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65  ilename and lowe
10d70 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f  rcase it.  ** to
10d80 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20   derive a mutex 
10d90 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20  name. */.  zTok 
10da0 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a  = osCharLowerW(z
10db0 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a  Name);.  for (;*
10dc0 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20  zTok;zTok++){.  
10dd0 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27    if (*zTok == '
10de0 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27  \\') *zTok = '_'
10df0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
10e00 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65  te/open the name
10e10 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69  d mutex */.  pFi
10e20 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43  le->hMutex = osC
10e30 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c  reateMutexW(NULL
10e40 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b  , FALSE, zName);
10e50 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
10e60 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c  Mutex){.    pFil
10e70 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
10e80 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
10e90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10ea0 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
10eb0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
10ec0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
10ed0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
10ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ef0 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
10f00 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c  eateLock1", zFil
10f10 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ename);.  }..  /
10f20 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
10f30 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  tex before conti
10f40 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  nuing */.  wince
10f50 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
10f60 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
10f70 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
10f80 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
10f90 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
10fa0 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
10fb0 74 63 20 61 72 65 0a 20 20 2a 2a 20 63 61 73 65  tc are.  ** case
10fc0 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65  -sensitive, take
10fd0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
10fe0 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e  at by uppercasin
10ff0 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65  g the mutex name
11000 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20  .  ** and using 
11010 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72  that as the shar
11020 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e  ed filemapping n
11030 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68  ame..  */.  osCh
11040 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b  arUpperW(zName);
11050 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  .  pFile->hShare
11060 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  d = osCreateFile
11070 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44  MappingW(INVALID
11080 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e  _HANDLE_VALUE, N
11090 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
110c0 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
110d0 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
110e0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
11110 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66  );..  /* Set a f
11120 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74  lag that indicat
11130 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69 72  es we're the fir
11140 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  st to create the
11150 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 0a 20 20   memory so it.  
11160 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  ** must be zero-
11170 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
11180 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
11190 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
111a0 20 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d   if (lastErrno =
111b0 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
111c0 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
111d0 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
111e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
111f0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
11200 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
11210 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
11220 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
11230 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
11240 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f( pFile->hShare
11250 64 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  d ){.    pFile->
11260 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c  shared = (winceL
11270 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66  ock*)osMapViewOf
11280 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  File(pFile->hSha
11290 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
112a0 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
112b0 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
112c0 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
112d0 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
112e0 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
112f0 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
11300 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
11310 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
11320 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c  */.    if( !pFil
11330 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20  e->shared ){.   
11340 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11350 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11360 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
11370 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11380 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
11390 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
113a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
113b0 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20  ceCreateLock2", 
113c0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
113d0 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
113e0 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  ;.      osCloseH
113f0 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
11400 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69  ared);.      pFi
11410 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55  le->hShared = NU
11420 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
11430 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65   /* If shared me
11440 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62  mory could not b
11450 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  e created, then 
11460 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  close the mutex 
11470 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66  and fail */.  if
11480 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
11490 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  ==NULL ){.    if
114a0 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20  ( !bLogged ){.  
114b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
114c0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
114d0 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
114e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
114f0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
11500 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11510 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
11520 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e  teLock3", zFilen
11530 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67  ame);.      bLog
11540 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ged = TRUE;.    
11550 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  }.    winceMutex
11560 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
11570 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
11580 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
11590 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
115a0 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
115b0 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LL;.    return S
115c0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
115d0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
115e0 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
115f0 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75 70  ory if we're sup
11600 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66  posed to */.  if
11610 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d  ( bInit ){.    m
11620 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68 61  emset(pFile->sha
11630 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  red, 0, sizeof(w
11640 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a  inceLock));.  }.
11650 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
11660 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11670 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
11680 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11690 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
116a0 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
116b0 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
116c0 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
116d0 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
116e0 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
116f0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
11700 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
11710 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
11720 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
11730 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
11740 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
11750 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
11760 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
11770 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
11780 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
11790 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
117a0 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
117b0 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
117c0 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
117d0 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
117e0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
117f0 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
11800 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
11810 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
11820 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11830 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
11840 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
11850 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
11860 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
11870 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
11880 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
11890 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
118a0 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
118b0 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
118c0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
118d0 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
118e0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
118f0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
11900 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
11910 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
11920 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
11930 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
11940 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
11950 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56   */.    osUnmapV
11960 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
11970 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73  >shared);.    os
11980 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
11990 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20  e->hShared);..  
119a0 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74    /* Done with t
119b0 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
119c0 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
119d0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
119e0 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
119f0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
11a00 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
11a10 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
11a20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d  }.}../*.** An im
11a30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
11a40 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41  the LockFile() A
11a50 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
11a60 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
11a70 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  OOL winceLockFil
11a80 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
11a90 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
11aa0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
11ab0 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
11ac0 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
11ad0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
11ae0 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
11af0 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
11b00 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  ToLockHigh.){.  
11b10 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
11b20 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
11b30 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
11b40 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
11b50 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  SE;..  UNUSED_PA
11b60 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66  RAMETER(dwFileOf
11b70 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55  fsetHigh);.  UNU
11b80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
11b90 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
11ba0 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
11bb0 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
11bc0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
11bd0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
11be0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11bf0 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61  ..  /* Wanting a
11c00 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11c10 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  ? */.  if (dwFil
11c20 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
11c30 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
11c40 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d  T.       && nNum
11c50 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
11c60 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
11c70 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20  ARED_SIZE){.    
11c80 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
11c90 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  d->nReaders == 0
11ca0 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65   && pFile->share
11cb0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
11cc0 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c   0){.       pFil
11cd0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
11ce0 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
11cf0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
11d00 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  l.bExclusive = T
11d10 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74  RUE;.       bRet
11d20 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
11d30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
11d40 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63   a read-only loc
11d50 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
11d60 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
11d70 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11d80 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20  D_FIRST &&.     
11d90 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42        nNumberOfB
11da0 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
11db0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
11dc0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
11dd0 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
11de0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
11df0 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  .nReaders ++;.  
11e00 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11e10 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
11e20 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69   1){.        pFi
11e30 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
11e40 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d  ders ++;.      }
11e50 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
11e60 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
11e70 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65  ..  /* Want a pe
11e80 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  nding lock? */. 
11e90 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11ea0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11eb0 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
11ec0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11ed0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
11ee0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11ef0 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69    /* If no pendi
11f00 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ng lock has been
11f10 20 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20   acquired, then 
11f20 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20  acquire it */.  
11f30 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
11f40 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d  red->bPending ==
11f50 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
11f60 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
11f70 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
11f80 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
11f90 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
11fa0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
11fb0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
11fc0 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73  .  /* Want a res
11fd0 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  erved lock? */. 
11fe0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11ff0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12000 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
12010 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
12020 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12030 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
12040 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
12050 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
12060 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
12070 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
12080 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
12090 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
120a0 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  l.bReserved = TR
120b0 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
120c0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
120d0 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
120e0 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
120f0 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
12100 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
12110 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
12120 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c  ation of the Unl
12130 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57  ockFile API of W
12140 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
12150 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
12160 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  ceUnlockFile(.  
12170 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
12180 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
12190 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
121a0 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
121b0 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
121c0 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
121d0 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
121e0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
121f0 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  nlockHigh.){.  w
12200 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
12210 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
12220 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
12230 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
12240 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
12250 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
12260 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
12270 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
12280 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12290 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
122a0 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
122b0 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
122c0 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
122d0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
122e0 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  ;..  /* Releasin
122f0 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20  g a reader lock 
12300 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
12310 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77  lock */.  if (dw
12320 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
12330 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
12340 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69  IRST){.    /* Di
12350 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63  d we have an exc
12360 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
12370 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
12380 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
12390 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
123a0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
123b0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
123c0 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  RD)SHARED_SIZE);
123d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
123e0 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
123f0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
12400 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
12410 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
12420 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
12430 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20   TRUE;.    }..  
12440 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74    /* Did we just
12450 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c   have a reader l
12460 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ock? */.    else
12470 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
12480 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
12490 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
124a0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
124b0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
124c0 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20  ARED_SIZE.      
124d0 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65         || nNumbe
124e0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
124f0 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
12500 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
12510 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
12520 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
12530 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
12540 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
12550 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
12560 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
12570 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
12580 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
12590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
125a0 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
125b0 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
125c0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
125d0 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
125e0 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
125f0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
12600 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
12610 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
12620 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
12630 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
12640 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
12650 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
12660 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
12670 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
12680 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
12690 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
126a0 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69    }.  /* Releasi
126b0 6e 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ng a reserved lo
126c0 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
126d0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
126e0 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
126f0 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
12700 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
12710 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
12720 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
12730 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
12740 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
12750 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
12760 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
12770 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12780 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
12790 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
127a0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
127b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
127c0 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
127d0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
127e0 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
127f0 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ./*.** End of th
12800 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66  e special code f
12810 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a  or wince.*******
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
12870 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  * SQLITE_OS_WINC
12880 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  E */../*.** Lock
12890 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
128a0 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
128b0 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  inLockFile(.  LP
128c0 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
128d0 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20   DWORD flags,.  
128e0 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c  DWORD offsetLow,
128f0 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48  .  DWORD offsetH
12900 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  igh,.  DWORD num
12910 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52  BytesLow,.  DWOR
12920 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29  D numBytesHigh.)
12930 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
12940 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINCE.  /*.  ** 
12950 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
12960 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
12970 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
12980 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
12990 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20   Win32.  **     
129a0 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a    API LockFile..
129b0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
129c0 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69  nceLockFile(phFi
129d0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
129e0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
12a10 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
12a20 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
12a30 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
12a40 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
12a50 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
12a60 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
12a70 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
12a80 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
12a90 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
12aa0 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
12ab0 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
12ac0 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  sLockFileEx(*phF
12ad0 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
12ae0 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
12af0 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
12b00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
12b10 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
12b20 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
12b30 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
12b40 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
12b70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
12b80 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20  ./*.** Unlock a 
12b90 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f  file region.. */
12ba0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
12bb0 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
12bc0 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
12bd0 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
12be0 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
12bf0 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
12c00 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
12c10 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
12c20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
12c30 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _WINCE.  /*.  **
12c40 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
12c50 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
12c60 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
12c70 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
12c80 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20  e Win32.  **    
12c90 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c     API UnlockFil
12ca0 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
12cb0 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
12cc0 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
12cd0 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
12d00 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
12d10 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
12d20 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
12d30 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
12d40 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
12d50 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
12d60 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
12d70 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
12d80 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
12d90 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
12da0 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
12db0 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
12dc0 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c  leEx(*phFile, 0,
12dd0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
12de0 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
12df0 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
12e00 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
12e10 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
12e20 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
12e30 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
12e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12e50 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
12e60 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
12e70 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  dif.}../********
12e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ec0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  *****.** The nex
12ed0 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  t group of routi
12ee0 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
12ef0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70  e I/O methods sp
12f00 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
12f10 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
12f20 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a  hods object..***
12f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
12f80 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
12f90 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
12fa0 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
12fb0 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
12fc0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
12fd0 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
12fe0 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
12ff0 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
13000 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
13010 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72  ** Move the curr
13020 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
13030 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
13040 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
13050 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
13060 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65  to offset iOffse
13070 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c  t within the fil
13080 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
13090 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f  , return 0..** O
130a0 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 70 46  therwise, set pF
130b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61  ile->lastErrno a
130c0 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
130d0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
130e0 74 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 77 69  t winSeekFile(wi
130f0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  nFile *pFile, sq
13100 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
13110 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  set){.#if !SQLIT
13120 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e  E_OS_WINRT.  LON
13130 47 20 75 70 70 65 72 42 69 74 73 3b 20 20 20 20  G upperBits;    
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13150 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69 74  Most sig. 32 bit
13160 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20  s of new offset 
13170 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42  */.  LONG lowerB
13180 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
13190 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69       /* Least si
131a0 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
131b0 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57  w offset */.  DW
131c0 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20 20 20  ORD dwRet;      
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131e0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
131f0 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  by SetFilePointe
13200 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  r() */.  DWORD l
13210 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
13220 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
13230 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
13240 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
13250 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
13260 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65  K file=%p, offse
13270 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65  t=%lld\n", pFile
13280 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a  ->h, iOffset));.
13290 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28  .  upperBits = (
132a0 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e  LONG)((iOffset>>
132b0 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
132c0 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
132d0 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20   (LONG)(iOffset 
132e0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a  & 0xffffffff);..
132f0 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a    /* API oddity:
13300 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
13310 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
13320 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64   returns a dword
13330 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  .  ** containing
13340 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69   the lower 32-bi
13350 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  ts of the new fi
13360 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69  le-offset. Or, i
13370 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a  f it fails,.  **
13380 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41   it returns INVA
13390 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
133a0 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63  NTER. However ac
133b0 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c  cording to MSDN,
133c0 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45  .  ** INVALID_SE
133d0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d  T_FILE_POINTER m
133e0 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c  ay also be a val
133f0 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53  id new offset. S
13400 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20  o to determine. 
13410 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65   ** whether an e
13420 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c  rror has actuall
13430 79 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69  y occurred, it i
13440 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
13450 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 47 65   to call.  ** Ge
13460 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20  tLastError()..  
13470 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53  */.  dwRet = osS
13480 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46  etFilePointer(pF
13490 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  ile->h, lowerBit
134a0 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
134b0 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
134c0 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c  f( (dwRet==INVAL
134d0 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
134e0 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c  TER.      && ((l
134f0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
13500 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
13510 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20  _ERROR)) ){.    
13520 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13530 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
13540 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
13550 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
13560 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13570 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13580 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22     "winSeekFile"
13590 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
135a0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
135b0 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
135c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
135d0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
135e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
135f0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
13600 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
13610 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13620 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
13630 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
13640 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20  /*.  ** Same as 
13650 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
13660 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  at this implemen
13670 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72  tation works for
13680 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20   WinRT..  */..  
13690 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b  LARGE_INTEGER x;
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65  /* The new offse
136c0 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74  t */.  BOOL bRet
136d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
136e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
136f0 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
13700 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a  ilePointerEx() *
13710 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20  /..  x.QuadPart 
13720 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65  = iOffset;.  bRe
13730 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  t = osSetFilePoi
13740 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c  nterEx(pFile->h,
13750 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49   x, 0, FILE_BEGI
13760 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29  N);..  if(!bRet)
13770 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
13780 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13790 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
137a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
137b0 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
137c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
137f0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13800 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
13810 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13820 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
13830 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
13840 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
13850 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
13860 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
13870 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
13880 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
13890 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  n 0;.#endif.}..#
138a0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
138b0 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72  AP_SIZE>0./* For
138c0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
138d0 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
138e0 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d  thods used for m
138f0 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c  emory mapped fil
13900 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
13910 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46   winMapfile(winF
13920 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
13930 74 36 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t64);.static int
13940 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69   winUnmapfile(wi
13950 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a  nFile*);.#endif.
13960 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
13970 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
13980 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
13990 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
139a0 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
139b0 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
139c0 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
139d0 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
139e0 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69  e result, but Wi
139f0 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
13a00 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
13a10 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
13a20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
13a30 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
13a40 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
13a50 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
13a60 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
13a70 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
13a80 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
13a90 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
13aa0 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
13ab0 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
13ac0 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
13ad0 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
13ae0 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
13af0 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
13b00 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
13b10 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
13b20 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
13b30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
13b40 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
13b50 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
13b60 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
13b70 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
13b80 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  id!=0 );.#ifndef
13b90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
13ba0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13bb0 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e  ->pShm==0 );.#en
13bc0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 46  dif.  assert( pF
13bd0 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20  ile->h!=NULL && 
13be0 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49  pFile->h!=INVALI
13bf0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
13c00 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  ;.  OSTRACE(("CL
13c10 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  OSE pid=%lu, pFi
13c20 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 5c 6e  le=%p, file=%p\n
13c30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
13c40 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
13c50 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
13c60 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53  ile->h));..#if S
13c70 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
13c80 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70  IZE>0.  winUnmap
13c90 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e  file(pFile);.#en
13ca0 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72  dif..  do{.    r
13cb0 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
13cc0 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
13cd0 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   /* SimulateIOEr
13ce0 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d  ror( rc=0; cnt=M
13cf0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b  X_CLOSE_ATTEMPT;
13d00 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28   ); */.  }while(
13d10 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20   rc==0 && ++cnt 
13d20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
13d30 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77  PT && (sqlite3_w
13d40 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c  in32_sleep(100),
13d50 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54   1) );.#if SQLIT
13d60 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69  E_OS_WINCE.#defi
13d70 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f  ne WINCE_DELETIO
13d80 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77  N_ATTEMPTS 3.  w
13d90 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
13da0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
13db0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
13dc0 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
13dd0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
13de0 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
13df0 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
13e00 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
13e10 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
13e20 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
13e30 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
13e40 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
13e50 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20  ffffffff.       
13e60 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43   && cnt++ < WINC
13e70 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
13e80 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  PTS.    ){.     
13e90 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
13ea0 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20  sleep(100);  /* 
13eb0 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65  Wait a little be
13ec0 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69  fore trying agai
13ed0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  n */.    }.    s
13ee0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
13ef0 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
13f00 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
13f10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
13f20 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a  File->h = NULL;.
13f30 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65    }.  OpenCounte
13f40 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45  r(-1);.  OSTRACE
13f50 28 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  (("CLOSE pid=%lu
13f60 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
13f70 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
13f80 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13f90 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
13fa0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
13fb0 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
13fc0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
13fd0 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
13fe0 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
13ff0 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  : winLogError(SQ
14000 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
14010 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
14020 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14040 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d  inClose", pFile-
14050 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >zPath);.}../*.*
14060 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
14070 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
14080 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
14090 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
140a0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
140b0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
140c0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
140d0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
140e0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
140f0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61  tatic int winRea
14100 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
14110 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
14120 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20  /* File to read 
14130 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  from */.  void *
14140 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
14150 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f       /* Write co
14160 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20  ntent into this 
14170 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
14180 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
14190 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
141a0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
141b0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
141c0 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
141d0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
141e0 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65  ng at this offse
141f0 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c  t */.){.#if !SQL
14200 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
14210 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14220 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
14230 50 45 44 29 0a 20 20 4f 56 45 52 4c 41 50 50 45  PED).  OVERLAPPE
14240 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
14250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66         /* The of
14260 66 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c  fset for ReadFil
14270 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77  e. */.#endif.  w
14280 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
14290 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
142a0 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
142b0 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
142e0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
142f0 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
14300 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
14310 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14320 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14330 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
14340 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
14350 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
14360 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
14370 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  t>=0 );.  Simula
14380 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
14390 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
143a0 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AD);.  OSTRACE((
143b0 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
143c0 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
143d0 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
143e0 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  unt=%d, ".      
143f0 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c       "offset=%ll
14400 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f  d, lock=%d\n", o
14410 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14420 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
14430 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14440 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
14450 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
14460 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
14470 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
14480 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
14490 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
144a0 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
144b0 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
144c0 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
144d0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
144e0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
144f0 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
14500 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
14510 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14520 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
14530 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
14540 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14550 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
14560 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
14570 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
14580 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
14590 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
145a0 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  MMAP pid=%lu, pF
145b0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
145c0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
145d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
145e0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
145f0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14600 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14620 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
14630 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
14640 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
14650 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
14660 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14670 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
14680 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
14690 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
146a0 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
146b0 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
146c0 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
146d0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
146e0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
146f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14700 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
14710 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e  S_WINCE || defin
14720 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
14730 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
14740 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
14750 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20  (pFile, offset) 
14760 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
14770 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
14780 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14790 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
147a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
147b0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
147c0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
147d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
147e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
147f0 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  FULL;.  }.  whil
14800 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
14810 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
14820 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29  mt, &nRead, 0) )
14830 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74  {.#else.  memset
14840 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
14850 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
14860 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  ED));.  overlapp
14870 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
14880 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
14890 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c  ffffff);.  overl
148a0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
148b0 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
148c0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
148d0 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  fff);.  while( !
148e0 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
148f0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
14900 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70  &nRead, &overlap
14910 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20  ped) &&.        
14920 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14930 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  )!=ERROR_HANDLE_
14940 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  EOF ){.#endif.  
14950 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
14960 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65  o;.    if( winRe
14970 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
14980 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
14990 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
149a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
149b0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
149c0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
149d0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
149e0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
149f0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c  LITE_IOERR_READ\
14a00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14a10 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14a20 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14a30 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14a40 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14a50 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14a60 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
14a70 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
14aa0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
14ab0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74  winLogIoerr(nRet
14ac0 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  ry, __LINE__);. 
14ad0 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
14ae0 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
14af0 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
14b00 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
14b10 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
14b20 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
14b30 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
14b40 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
14b50 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
14b60 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
14b70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14b80 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14b90 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c  R_SHORT_READ\n",
14ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
14bb0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14bc0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
14bd0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14bf0 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
14c00 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  }..  OSTRACE(("R
14c10 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
14c20 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14c30 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
14c40 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
14c50 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14c60 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14c70 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
14c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14c90 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
14ca0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
14cb0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
14cc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
14cd0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
14ce0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
14cf0 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
14d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14d10 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
14d20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
14d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
14d40 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
14d50 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
14d60 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
14d70 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
14d80 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
14d90 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14dc0 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
14dd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
14de0 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
14df0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
14e00 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
14e10 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
14e20 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
14e30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14e50 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
14e60 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
14e70 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
14e80 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
14e90 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
14ea0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
14eb0 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ed0 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
14ee0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
14ef0 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
14f00 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
14f10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
14f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14f30 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
14f40 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
14f50 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
14f60 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
14f70 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c  E(("WRITE pid=%l
14f80 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
14f90 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
14fa0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20   amount=%d, ".  
14fb0 20 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74           "offset
14fc0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
14fd0 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
14fe0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
14ff0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  e,.           pF
15000 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
15010 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65  t, offset, pFile
15020 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
15030 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
15040 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
15050 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
15060 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
15070 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
15080 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
15090 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
150a0 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
150b0 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
150c0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
150d0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
150e0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
150f0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
15100 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
15110 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
15120 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15130 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
15140 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
15150 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
15160 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
15170 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
15180 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 70 69 64  ("WRITE-MMAP pid
15190 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
151a0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
151b0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
151c0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
151d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
151e0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
151f0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
15200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
15210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15220 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
15230 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15240 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
15250 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
15260 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
15270 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
15280 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
15290 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
152a0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
152b0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
152c0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
152d0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
152e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
152f0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15300 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15310 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
15320 41 50 50 45 44 29 0a 20 20 72 63 20 3d 20 77 69  APPED).  rc = wi
15330 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
15340 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
15350 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20  rc==0 ){.#else. 
15360 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53   {.#endif.#if !S
15370 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
15380 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
15390 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
153a0 41 50 50 45 44 29 0a 20 20 20 20 4f 56 45 52 4c  APPED).    OVERL
153b0 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64  APPED overlapped
153c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
153d0 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65  offset for Write
153e0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
153f0 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28      u8 *aRem = (
15400 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20  u8 *)pBuf;      
15410 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f    /* Data yet to
15420 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
15430 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d     int nRem = am
15440 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
15450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
15460 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72  tes yet to be wr
15470 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f  itten */.    DWO
15480 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  RD nWrite;      
15490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
154a0 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65  tes written by e
154b0 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20  ach WriteFile() 
154c0 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52  call */.    DWOR
154d0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
154e0 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c  _ERROR;   /* Val
154f0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47  ue returned by G
15500 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f  etLastError() */
15510 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
15520 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
15530 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
15540 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
15550 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c     memset(&overl
15560 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
15570 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
15580 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
15590 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
155a0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
155b0 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  f);.    overlapp
155c0 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
155d0 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
155e0 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
155f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77  );.#endif..    w
15600 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
15610 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
15620 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  NCE || defined(S
15630 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
15640 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20  VERLAPPED).     
15650 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
15660 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
15670 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
15680 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20   0) ){.#else.   
15690 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
156a0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
156b0 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
156c0 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  e, &overlapped) 
156d0 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ){.#endif.      
156e0 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
156f0 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
15700 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
15710 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
15720 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15730 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
15740 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
15750 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
15760 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
15770 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
15780 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
15790 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
157a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
157b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
157c0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
157d0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
157e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
157f0 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
15800 50 45 44 29 0a 20 20 20 20 20 20 6f 66 66 73 65  PED).      offse
15810 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
15820 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
15830 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
15840 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
15850 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  f);.      overla
15860 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
15870 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
15880 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
15890 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ff);.#endif.    
158a0 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65    aRem += nWrite
158b0 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
158c0 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20  nWrite;.    }.  
158d0 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a    if( nRem>0 ){.
158e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
158f0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
15900 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  no;.      rc = 1
15910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15920 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
15930 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74     ( pFile->last
15940 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e  Errno==ERROR_HAN
15950 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a  DLE_DISK_FULL ).
15960 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c         || ( pFil
15970 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
15980 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29  ROR_DISK_FULL ))
15990 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
159a0 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
159b0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
159c0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
159d0 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  LL\n",.         
159e0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
159f0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15a00 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
15a10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
15a20 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15a30 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c  E_FULL, pFile->l
15a40 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 20 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20     "winWrite1", 
15a70 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15a80 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45     }.    OSTRACE
15a90 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
15aa0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
15ab0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
15ac0 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20  OERR_WRITE\n",. 
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
15ae0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15af0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
15b00 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
15b10 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
15b20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
15b30 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
15b40 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15b50 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15b60 57 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  Write2", pFile->
15b70 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
15b80 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
15b90 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f  (nRetry, __LINE_
15ba0 5f 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  _);.  }.  OSTRAC
15bb0 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c  E(("WRITE pid=%l
15bc0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
15bd0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15be0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
15bf0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
15c00 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15c10 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
15c40 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
15c50 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
15c60 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
15c70 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
15c80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15c90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
15ca0 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
15cb0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
15cc0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
15cd0 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
15ce0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15cf0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
15d00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15d10 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
15d20 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20  tion */.  DWORD 
15d30 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73  lastErrno;..  as
15d40 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15d50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15d60 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
15d70 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a  OERR_TRUNCATE);.
15d80 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
15d90 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  CATE pid=%lu, pF
15da0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
15db0 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b   size=%lld, lock
15dc0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15dd0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
15de0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
15df0 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  e, pFile->h, nBy
15e00 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  te, pFile->lockt
15e10 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
15e20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
15e30 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
15e40 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
15e50 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
15e60 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
15e70 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
15e80 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
15e90 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
15ea0 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
15eb0 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
15ec0 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
15ed0 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
15ee0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
15ef0 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
15f00 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15f10 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
15f20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
15f30 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
15f40 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
15f50 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
15f60 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
15f70 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65   /* SetEndOfFile
15f80 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  () returns non-z
15f90 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73  ero when success
15fa0 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65  ful, or zero whe
15fb0 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  n it fails. */. 
15fc0 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
15fd0 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29  (pFile, nByte) )
15fe0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
15ff0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
16000 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
16010 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
16040 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
16050 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
16060 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
16070 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20  e(pFile->h) &&. 
16080 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73             ((las
16090 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
160a0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
160b0 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49  R_USER_MAPPED_FI
160c0 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LE) ){.    pFile
160d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
160e0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
160f0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
16100 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
16110 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
16120 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
16130 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
16140 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c  Truncate2", pFil
16150 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
16160 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16170 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
16180 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
16190 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73  truncated to a s
161a0 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  ize smaller than
161b0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   the currently. 
161c0 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f   ** mapped regio
161d0 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66  n, reduce the ef
161e0 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20  fective mapping 
161f0 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51  size as well. SQ
16200 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75  Lite will.  ** u
16210 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
16220 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
16230 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
16240 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
16250 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
16260 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
16270 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d   && nByte<pFile-
16280 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
16290 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
162a0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65   = nByte;.  }.#e
162b0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
162c0 28 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25  ("TRUNCATE pid=%
162d0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
162e0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
162f0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
16300 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
16310 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
16320 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
16330 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
16340 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
16350 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
16360 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
16370 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
16380 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
16390 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
163a0 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
163b0 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
163c0 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
163d0 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
163e0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
163f0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
16400 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
16410 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
16420 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16430 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
16440 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
16450 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
16460 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
16470 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
16480 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69  int winSync(sqli
16490 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
164a0 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65  t flags){.#ifnde
164b0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
164c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
164d0 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45  only when SQLITE
164e0 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
164f0 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20  defined..   */. 
16500 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66   BOOL rc;.#endif
16510 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
16520 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65  EBUG) || !define
16530 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  d(SQLITE_NO_SYNC
16540 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e  ) || \.    defin
16550 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
16560 53 5f 54 52 41 43 45 29 0a 20 20 2f 2a 0a 20 20  S_TRACE).  /*.  
16570 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c  ** Used when SQL
16580 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
16590 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62  ot defined and b
165a0 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61  y the assert() a
165b0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41  nd/or.  ** OSTRA
165c0 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20  CE() macros..   
165d0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
165e0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
165f0 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
16600 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
16610 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
16620 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
16630 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
16640 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
16650 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
16660 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
16670 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
16680 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
16690 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
166a0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
166b0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
166c0 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
166d0 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
166e0 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
166f0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
16700 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
16710 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
16720 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
16730 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
16740 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
16750 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
16760 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
16770 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
16780 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
16790 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46  SYNC pid=%lu, pF
167a0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
167b0 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
167c0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
167d0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
167e0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
167f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67  , pFile->h, flag
16800 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  s,.           pF
16810 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
16820 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16830 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
16840 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
16850 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
16860 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
16870 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
16880 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
16890 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
168a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
168b0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
168c0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
168d0 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
168e0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
168f0 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
16900 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
16910 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16920 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54  TE_NO_SYNC.  OST
16930 52 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20  RACE(("SYNC-NOP 
16940 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
16950 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
16960 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
16970 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16980 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16990 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
169a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
169b0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69  ITE_OK;.#else.#i
169c0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
169d0 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
169e0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
169f0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 46 6c   ){.    if( osFl
16a00 75 73 68 56 69 65 77 4f 66 46 69 6c 65 28 70 46  ushViewOfFile(pF
16a10 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  ile->pMapRegion,
16a20 20 30 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54   0) ){.      OST
16a30 52 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50  RACE(("SYNC-MMAP
16a40 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
16a50 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25  %p, pMapRegion=%
16a60 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  p, ".           
16a70 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 4f      "rc=SQLITE_O
16a80 4b 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  K\n", osGetCurre
16a90 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20  ntProcessId(),. 
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
16ab0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  ile, pFile->pMap
16ac0 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 65  Region));.    }e
16ad0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
16ae0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
16af0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
16b00 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16b10 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c  SYNC-MMAP pid=%l
16b20 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
16b30 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
16b50 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
16b60 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
16b70 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a  entProcessId(),.
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16b90 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61  File, pFile->pMa
16ba0 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
16bb0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16bc0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16bd0 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
16be0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 22 77 69 6e 53 79 6e 63 31 22 2c 20 70 46    "winSync1", pF
16c10 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
16c20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
16c30 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
16c40 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
16c50 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
16c60 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
16c70 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
16c80 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16c90 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
16ca0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
16cb0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
16cc0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16cd0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16ce0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16cf0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16d10 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
16d20 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
16d30 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16d40 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
16d50 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  C pid=%lu, pFile
16d60 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
16d70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
16d80 59 4e 43 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  YNC\n",.        
16d90 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16da0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16db0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
16dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
16dd0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
16de0 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
16df0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 20 20 20 22 77 69 6e 53 79 6e 63 32 22 2c       "winSync2",
16e20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16e30 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
16e40 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
16e50 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
16e60 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
16e70 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
16e80 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  winFileSize(sqli
16e90 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
16ea0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
16eb0 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ze){.  winFile *
16ec0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
16ed0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
16ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
16ef0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
16f00 20 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21    assert( pSize!
16f10 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
16f20 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
16f30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
16f40 54 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  T);.  OSTRACE(("
16f50 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
16f60 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  ize=%p\n", pFile
16f70 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23  ->h, pSize));..#
16f80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
16f90 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f  RT.  {.    FILE_
16fa0 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e  STANDARD_INFO in
16fb0 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  fo;.    if( osGe
16fc0 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
16fd0 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
16fe0 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72  ->h, FileStandar
16ff0 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  dInfo,.         
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66              &inf
17020 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
17030 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
17040 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c   = info.EndOfFil
17050 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20  e.QuadPart;.    
17060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
17070 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17080 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
17090 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
170a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
170b0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
170c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
170f0 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
17100 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
17110 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52  lse.  {.    DWOR
17120 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20  D upperBits;.   
17130 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73   DWORD lowerBits
17140 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  ;.    DWORD last
17150 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65  Errno;..    lowe
17160 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
17170 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
17180 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20  &upperBits);.   
17190 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
171a0 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
171b0 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
171c0 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20  erBits;.    if( 
171d0 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20    (lowerBits == 
171e0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a  INVALID_FILE_SIZ
171f0 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c  E).       && ((l
17200 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
17210 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
17220 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20  _ERROR) ){.     
17230 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17240 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
17250 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
17260 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
17270 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
17280 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
172b0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
172c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
172d0 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  f.  OSTRACE(("SI
172e0 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
172f0 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c  e=%p, *pSize=%ll
17300 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
17310 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
17320 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c  , pSize, *pSize,
17330 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
17340 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
17350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
17360 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17370 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
17380 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
17390 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
173a0 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
173b0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
173c0 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
173d0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
173e0 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
173f0 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
17400 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
17410 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
17420 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
17430 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
17440 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
17450 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
17460 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
17470 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
17480 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
17490 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
174a0 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
174b0 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
174c0 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
174d0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
174e0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
174f0 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
17500 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
17510 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
17520 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
17530 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
17540 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
17550 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
17560 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
17570 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
17580 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
17590 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
175a0 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
175b0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
175c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
175d0 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
175e0 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
175f0 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
17600 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17610 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
17640 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
17650 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
17660 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
17670 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
17680 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
17690 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
176a0 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
176b0 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
176c0 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
176d0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
176e0 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
176f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
17700 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
17710 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
17720 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
17730 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
17740 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
17750 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
17760 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
17770 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
17780 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
17790 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
177a0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
177b0 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
177c0 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
177d0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52  atic int winGetR
177e0 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
177f0 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
17800 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
17810 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
17820 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
17830 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17840 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
17850 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
17860 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
17870 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  E.    /*.    ** 
17880 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
17890 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
178a0 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
178b0 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
178c0 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20   Win32.    **   
178d0 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
178e0 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  Ex..    */.    r
178f0 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69  es = winceLockFi
17900 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
17910 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31  ARED_FIRST, 0, 1
17920 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
17930 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
17940 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
17950 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
17960 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52  LAGS, SHARED_FIR
17970 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ST, 0,.         
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17990 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65  RED_SIZE, 0);.#e
179a0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
179b0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
179c0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
179d0 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71    int lk;.    sq
179e0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
179f0 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
17a00 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  );.    pFile->sh
17a10 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
17a20 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37  short)((lk & 0x7
17a30 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
17a40 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20  _SIZE - 1));.   
17a50 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
17a60 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
17a70 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
17a80 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
17a90 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17aa0 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
17ab0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
17ac0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
17ad0 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d  dif.  if( res ==
17ae0 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
17af0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
17b00 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
17b10 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
17b20 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74   log a failure t
17b30 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  o lock */.  }.  
17b40 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
17b50 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
17b60 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ult=%d\n", pFile
17b70 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65  ->h, res));.  re
17b80 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
17b90 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f  ** Undo a readlo
17ba0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ck.*/.static int
17bb0 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
17bc0 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
17bd0 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
17be0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
17bf0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
17c00 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
17c10 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
17c20 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17c30 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
17c40 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
17c50 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
17c60 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17c70 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
17c80 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
17c90 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
17ca0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
17cb0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
17cc0 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
17cd0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17ce0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
17cf0 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
17d00 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  e, 0, 1, 0);.  }
17d10 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65  .#endif.  if( re
17d20 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72  s==0 && ((lastEr
17d30 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
17d40 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e  rror())!=ERROR_N
17d50 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20  OT_LOCKED) ){.  
17d60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17d70 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
17d80 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
17d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
17da0 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  OCK, pFile->last
17db0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17dc0 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63         "winUnloc
17dd0 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c  kReadLock", pFil
17de0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
17df0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
17e00 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
17e10 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46  result=%d\n", pF
17e20 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
17e30 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
17e40 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
17e50 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
17e60 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
17e70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
17e80 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
17e90 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
17ea0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
17eb0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
17ec0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
17ed0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
17ee0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
17ef0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
17f00 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
17f10 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
17f20 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
17f30 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
17f40 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
17f50 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
17f60 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
17f70 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
17f80 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
17f90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
17fa0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
17fb0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
17fc0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
17fd0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
17fe0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
17ff0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
18000 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
18010 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
18020 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
18030 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
18040 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
18050 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
18060 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
18070 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
18080 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
18090 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
180a0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
180b0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
180c0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
180d0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
180e0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
180f0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
18100 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
18110 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
18120 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
18130 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
18140 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
18150 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
18160 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
18170 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
18180 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
18190 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
181a0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
181b0 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
181c0 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
181d0 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
181e0 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
181f0 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
18200 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
18210 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18220 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
18230 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18240 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
18250 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
18260 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
18270 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
18280 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
18290 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
182a0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
182b0 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
182c0 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
182d0 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
182e0 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
182f0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
18300 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
18310 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
18320 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
18330 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
18340 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
18350 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
18360 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
18370 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
18380 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
18390 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
183a0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "LOCK file=%p, o
183b0 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
183c0 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
183d0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
183e0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
183f0 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
18400 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
18410 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
18420 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
18430 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
18440 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
18450 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
18460 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
18470 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
18480 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
18490 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
184a0 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
184b0 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
184c0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
184d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
184e0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
184f0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
18500 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c  TRACE(("LOCK-HEL
18510 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
18520 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
18530 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
18540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18550 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  }..  /* Do not a
18560 6c 6c 6f 77 20 61 6e 79 20 6b 69 6e 64 20 6f 66  llow any kind of
18570 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61   write-lock on a
18580 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
18590 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ase.  */.  if( (
185a0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
185b0 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
185c0 59 29 21 3d 30 20 26 26 20 6c 6f 63 6b 74 79 70  Y)!=0 && locktyp
185d0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
185e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
185f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
18600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
18610 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
18620 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
18630 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
18640 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
18650 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
18660 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
18670 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
18680 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
18690 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
186a0 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
186b0 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
186c0 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
186d0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
186e0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
186f0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
18700 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
18710 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
18720 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
18730 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
18740 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
18750 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
18760 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
18770 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
18780 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
18790 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
187a0 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
187b0 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
187c0 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70  type;.  if(   (p
187d0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
187e0 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c  NO_LOCK).     ||
187f0 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d   (   (locktype==
18800 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
18810 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69           && (pFi
18820 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
18830 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SERVED_LOCK)).  
18840 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
18850 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
18860 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
18870 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
18880 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
18890 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
188d0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
188e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
188f0 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
18900 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
18910 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
18920 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
18930 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
18940 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
18950 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
18960 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
18970 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
18980 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
18990 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
189a0 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
189b0 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
189c0 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
189d0 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
189e0 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
189f0 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
18a00 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
18a10 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
18a20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
18a30 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
18a40 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
18a50 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
18a60 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d  (("LOCK-PENDING-
18a70 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f  FAIL file=%p, co
18a80 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74 3d 25  unt=%d, result=%
18a90 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
18aa0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63       pFile->h, c
18ab0 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 20  nt, res));.     
18ac0 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
18ad0 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f 48 41  ERROR_INVALID_HA
18ae0 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NDLE ){.        
18af0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
18b00 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
18b10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18b20 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
18b30 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18b40 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25  LOCK-FAIL file=%
18b50 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d  p, count=%d, rc=
18b60 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
18b70 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
18b80 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45 72  , cnt, sqlite3Er
18b90 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
18ba0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18bc0 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33 5f  ( cnt ) sqlite3_
18bd0 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a  win32_sleep(1);.
18be0 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e      }.    gotPen
18bf0 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a  dingLock = res;.
18c00 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a      if( !res ){.
18c10 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
18c20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
18c30 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
18c40 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68   /* Acquire a sh
18c50 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  ared lock.  */. 
18c60 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
18c70 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  HARED_LOCK && re
18c80 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
18c90 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18ca0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ==NO_LOCK );.   
18cb0 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52 65 61   res = winGetRea
18cc0 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
18cd0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
18ce0 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
18cf0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
18d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
18d10 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
18d20 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
18d30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
18d40 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
18d50 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
18d60 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
18d70 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
18d80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
18d90 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
18da0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18db0 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
18dc0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
18dd0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
18de0 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42  LAGS, RESERVED_B
18df0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
18e00 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
18e10 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
18e20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b  = RESERVED_LOCK;
18e30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18e40 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
18e50 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
18e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18e70 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  Acquire a PENDIN
18e80 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  G lock.  */.  if
18e90 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
18ea0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
18eb0 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b  s ){.    newLock
18ec0 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
18ed0 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64  OCK;.    gotPend
18ee0 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d  ingLock = 0;.  }
18ef0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
18f00 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
18f10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
18f20 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
18f30 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
18f40 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18f50 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52  ->locktype>=SHAR
18f60 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
18f70 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  es = winUnlockRe
18f80 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
18f90 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
18fa0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
18fb0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
18fc0 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49  FLAGS, SHARED_FI
18fd0 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  RST, 0,.        
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
18ff0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
19000 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
19010 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
19020 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
19030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19040 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
19050 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
19060 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52 65 61  .      winGetRea
19070 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
19080 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
19090 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
190a0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
190b0 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
190c0 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
190d0 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
190e0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
190f0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
19100 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
19110 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
19120 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
19130 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
19140 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
19150 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
19160 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
19170 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69   lock has held i
19180 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
19190 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20  iptor then.  ** 
191a0 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  return the appro
191b0 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f  priate result co
191c0 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  de..  */.  if( r
191d0 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  es ){.    rc = S
191e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
191f0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
19200 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
19210 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
19220 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 4f  LITE_BUSY;.    O
19230 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41  STRACE(("LOCK-FA
19240 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74  IL file=%p, want
19250 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22  ed=%d, got=%d\n"
19260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
19270 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
19280 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
19290 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
192a0 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65  ocktype = (u8)ne
192b0 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54  wLocktype;.  OST
192c0 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65  RACE(("LOCK file
192d0 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63  =%p, lock=%d, rc
192e0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
192f0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
19300 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71  le->locktype, sq
19310 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
19320 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
19330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19340 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
19350 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
19360 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
19370 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
19380 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
19390 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
193a0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
193b0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
193c0 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
193d0 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
193e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
193f0 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
19400 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
19410 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
19420 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  Out){.  int res;
19430 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
19440 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
19450 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
19460 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
19470 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
19480 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
19490 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
194a0 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
194b0 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
194c0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
194d0 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ut));..  assert(
194e0 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   id!=0 );.  if( 
194f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
19500 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
19510 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20  {.    res = 1;. 
19520 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
19530 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
19540 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28 6c 6f  p, result=%d (lo
19550 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  cal)\n", pFile->
19560 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65 6c 73  h, res));.  }els
19570 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  e{.    res = win
19580 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
19590 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
195a0 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45  ILEEX_FLAGS,RESE
195b0 52 56 45 44 5f 42 59 54 45 2c 30 2c 31 2c 30 29  RVED_BYTE,0,1,0)
195c0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
195d0 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  .      winUnlock
195e0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
195f0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
19600 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
19610 20 20 20 72 65 73 20 3d 20 21 72 65 73 3b 0a 20     res = !res;. 
19620 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
19630 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
19640 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28 72 65  p, result=%d (re
19650 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
19660 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20  >h, res));.  }. 
19670 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 3b   *pResOut = res;
19680 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
19690 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
196a0 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a  p, pResOut=%p, *
196b0 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53  pResOut=%d, rc=S
196c0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
196d0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
196e0 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
196f0 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
19700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19710 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
19720 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
19730 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
19740 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  d to locktype.  
19750 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
19760 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
19770 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
19780 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
19790 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
197a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
197b0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
197c0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
197d0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
197e0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
197f0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19800 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  -op..**.** It is
19810 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
19820 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
19830 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65  o fail if the se
19840 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
19850 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66   is NO_LOCK.  If
19860 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19870 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c  ment is SHARED_L
19880 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OCK then this ro
19890 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72  utine.** might r
198a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
198b0 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  RR;.*/.static in
198c0 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69  t winUnlock(sqli
198d0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
198e0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
198f0 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69  nt type;.  winFi
19900 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
19910 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
19920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19930 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
19940 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19950 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
19960 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41  _LOCK );.  OSTRA
19970 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
19980 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
19990 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
199a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
199b0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
199c0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
199d0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
199e0 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74   locktype));.  t
199f0 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
19a00 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
19a10 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_LOC
19a20 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
19a30 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
19a40 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
19a50 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
19a60 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
19a70 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
19a80 4b 20 26 26 20 21 77 69 6e 47 65 74 52 65 61 64  K && !winGetRead
19a90 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20  Lock(pFile) ){. 
19aa0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
19ab0 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
19ac0 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77  .  We should alw
19ad0 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20  ays be able to. 
19ae0 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72       ** reacquir
19af0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  e the read lock 
19b00 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  */.      rc = wi
19b10 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
19b20 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f  _IOERR_UNLOCK, o
19b30 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
19b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b50 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f          "winUnlo
19b60 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
19b70 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
19b80 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56  if( type>=RESERV
19b90 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
19ba0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
19bb0 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
19bc0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
19bd0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
19be0 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ype==NO_LOCK && 
19bf0 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
19c00 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
19c10 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
19c20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70  );.  }.  if( typ
19c30 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
19c40 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
19c50 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
19c60 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
19c70 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46   1, 0);.  }.  pF
19c80 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
19c90 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
19ca0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
19cb0 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
19cc0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
19cd0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
19ce0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
19cf0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
19d00 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
19d10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
19d20 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
19d30 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
19d40 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
19d50 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
19d60 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
19d70 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
19d80 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
19d90 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
19da0 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
19db0 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
19dc0 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
19dd0 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
19de0 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
19df0 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
19e00 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64  atic void winMod
19e10 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46  eBit(winFile *pF
19e20 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
19e30 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
19e40 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
19e50 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
19e60 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
19e70 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
19e80 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
19e90 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
19ea0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
19eb0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
19ec0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
19ed0 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
19ee0 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
19ef0 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
19f00 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
19f10 64 73 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  ds used for temp
19f20 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73  orary files */.s
19f30 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
19f40 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33  Tempname(sqlite3
19f50 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29  _vfs *, char **)
19f60 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
19f70 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
19f80 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c   *);.static BOOL
19f90 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
19fa0 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20  rAndColon(const 
19fb0 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char *);../*.** 
19fc0 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
19fd0 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
19fe0 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
19ff0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
1a000 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1a010 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1a020 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1a030 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
1a040 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
1a050 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1a060 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64  L file=%p, op=%d
1a070 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46  , pArg=%p\n", pF
1a080 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67  ile->h, op, pArg
1a090 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  ));.  switch( op
1a0a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
1a0b0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
1a0c0 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
1a0d0 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1a0e0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
1a0f0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1a100 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1a110 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
1a120 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1a130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a140 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1a150 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54  QLITE_FCNTL_LAST
1a160 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1a170 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
1a180 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  nt)pFile->lastEr
1a190 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rno;.      OSTRA
1a1a0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a1b0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1a1c0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1a1d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a1e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a1f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1a200 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1a210 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1a220 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1a230 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53  *)pArg;.      OS
1a240 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a250 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1a260 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1a270 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1a280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a290 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1a2a0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1a2b0 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  T: {.      if( p
1a2c0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1a2d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a2e0 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a  e3_int64 oldSz;.
1a2f0 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
1a300 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c   winFileSize(id,
1a310 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20   &oldSz);.      
1a320 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a330 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a340 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1a350 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33  ewSz = *(sqlite3
1a360 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
1a370 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53          if( newS
1a380 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20  z>oldSz ){.     
1a390 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1a3a0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1a3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1a3c0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64  = winTruncate(id
1a3d0 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20  , newSz);.      
1a3e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1a3f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1a400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53      }.        OS
1a420 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a430 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1a440 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
1a450 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a460 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a470 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1a480 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1a490 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1a4a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
1a4b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1a4c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a4d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1a4e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1a4f0 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1a500 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
1a510 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
1a520 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
1a530 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
1a540 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a550 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1a560 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1a570 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a590 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1a5a0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
1a5b0 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
1a5c0 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
1a5d0 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
1a5e0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
1a5f0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1a600 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1a610 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1a620 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1a630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a640 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1a650 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
1a660 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
1a670 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1a680 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1a690 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
1a6a0 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
1a6b0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a6c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1a6d0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1a6e0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1a6f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1a710 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
1a720 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
1a730 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
1a740 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
1a750 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
1a760 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
1a770 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  y = a[0];.      
1a780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
1a790 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [0] = winIoerrRe
1a7a0 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  try;.      }.   
1a7b0 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b     if( a[1]>0 ){
1a7c0 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72  .        winIoer
1a7d0 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b  rRetryDelay = a[
1a7e0 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
1a7f0 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20  .        a[1] = 
1a800 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
1a810 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ay;.      }.    
1a820 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1a830 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1a840 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
1a850 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1a860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a870 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1a880 49 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73  ITE_TEST.    cas
1a890 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
1a8a0 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a  IN32_SET_HANDLE:
1a8b0 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c   {.      LPHANDL
1a8c0 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41  E phFile = (LPHA
1a8d0 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20  NDLE)pArg;.     
1a8e0 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65   HANDLE hOldFile
1a8f0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
1a900 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70     pFile->h = *p
1a910 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68  hFile;.      *ph
1a920 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b  File = hOldFile;
1a930 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1a940 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25  "FCNTL oldFile=%
1a950 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72  p, newFile=%p, r
1a960 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1a980 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  OldFile, pFile->
1a990 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
1a9a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1a9b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1a9c0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1a9d0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
1a9e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
1a9f0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  le = 0;.      in
1aa00 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d  t rc = winGetTem
1aa10 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
1aa20 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20  s, &zTFile);.   
1aa30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1aa40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1aa50 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1aa60 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
1aa70 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1aa80 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1aa90 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
1aaa0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
1aab0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
1aac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1aad0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1aae0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
1aaf0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ab00 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
1ab10 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
1ab20 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
1ab30 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
1ab40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1ab50 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
1ab60 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ab70 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
1ab80 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
1ab90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1aba0 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
1abb0 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
1abc0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
1abd0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
1abe0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
1abf0 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
1ac00 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1ac10 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
1ac20 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
1ac30 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1ac40 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
1ac50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1ac60 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
1ac70 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55  {.          winU
1ac80 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
1ac90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1aca0 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
1acb0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
1acc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
1acd0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1ace0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1acf0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
1ad00 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1ad10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1ad20 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
1ad30 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1ad40 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1ad50 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
1ad60 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
1ad70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ad80 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
1ad90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ada0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
1adb0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
1adc0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
1add0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
1ade0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
1adf0 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
1ae00 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
1ae10 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
1ae20 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
1ae30 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
1ae40 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
1ae50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1ae60 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
1ae70 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1ae80 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
1ae90 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
1aea0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
1aeb0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
1aec0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
1aed0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
1aee0 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
1aef0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1af00 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
1af10 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
1af20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
1af30 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1af40 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
1af50 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
1af60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1af70 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
1af80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
1af90 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
1afa0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
1afb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1afc0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
1afd0 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1afe0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
1aff0 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
1b000 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
1b010 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
1b020 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
1b030 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
1b040 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
1b050 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
1b060 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1b070 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
1b080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f  ;.}../*.** Windo
1b090 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
1b0a0 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
1b0b0 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
1b0c0 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
1b0d0 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
1b0e0 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
1b0f0 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
1b100 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
1b110 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
1b120 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
1b130 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
1b140 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45  .*/.static SYSTE
1b150 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
1b160 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o;..#ifndef SQLI
1b170 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
1b180 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
1b190 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
1b1a0 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
1b1b0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
1b1c0 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
1b1d0 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
1b1e0 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
1b1f0 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
1b200 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69  ed by.** this fi
1b210 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
1b220 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62   may be shared b
1b230 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
1b240 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
1b250 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  on winShmMutexHe
1b260 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
1b270 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
1b280 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a  e global mutex.*
1b290 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
1b2a0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
1b2b0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
1b2c0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
1b2d0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
1b2e0 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
1b2f0 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
1b300 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
1b310 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
1b320 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
1b330 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1b340 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
1b350 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  d winShmEnterMut
1b360 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
1b370 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b380 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1b390 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1b3a0 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
1b3b0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1b3c0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
1b3d0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1b3e0 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1b3f0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1b400 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1b410 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 6e 64 65  VFS1));.}.#ifnde
1b420 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
1b430 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
1b440 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
1b450 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1b460 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
1b470 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
1b480 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46  _MUTEX_STATIC_VF
1b490 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  S1));.}.#endif..
1b4a0 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
1b4b0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
1b4c0 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
1b4d0 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
1b4e0 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
1b4f0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
1b500 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
1b510 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
1b520 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
1b530 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
1b540 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
1b550 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
1b560 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
1b570 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
1b580 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
1b590 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
1b5a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
1b5b0 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
1b5c0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
1b5d0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
1b5e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
1b5f0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
1b600 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
1b610 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
1b620 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
1b630 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
1b640 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1b650 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
1b660 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
1b670 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
1b680 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ext.**.** The fo
1b690 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1b6a0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1b6b0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1b6c0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
1b6d0 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
1b6e0 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
1b6f0 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
1b700 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
1b710 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
1b720 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
1b730 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
1b740 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
1b750 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
1b760 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
1b770 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
1b780 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
1b790 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
1b7a0 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
1b7b0 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1b7c0 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
1b7d0 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
1b7e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
1b7f0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1b800 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b810 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
1b820 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
1b830 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
1b840 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
1b850 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
1b860 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1b870 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
1b880 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1b890 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
1b8a0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1b8b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
1b8c0 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
1b8d0 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
1b8e0 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
1b8f0 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
1b900 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
1b910 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
1b920 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
1b930 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
1b940 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
1b950 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
1b960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
1b970 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
1b980 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
1b990 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
1b9a0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1b9b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b9c0 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
1b9d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1b9e0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
1b9f0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1ba00 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
1ba10 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1ba20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
1ba30 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
1ba40 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1ba50 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
1ba60 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1ba70 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  s */.#if defined
1ba80 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
1ba90 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1baa0 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a  _HAVE_OS_TRACE).
1bab0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bad0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77  Next available w
1bae0 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  inShm.id value *
1baf0 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1bb00 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61  ** A global arra
1bb10 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  y of all winShmN
1bb20 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a  ode objects..**.
1bb30 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74  ** The winShmMut
1bb40 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
1bb50 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64   true while read
1bb60 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1bb70 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  his list..*/.sta
1bb80 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  tic winShmNode *
1bb90 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
1bba0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63   0;../*.** Struc
1bbb0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
1bbc0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
1bbd0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
1bbe0 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
1bbf0 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
1bc00 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1bc10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1bc20 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
1bc30 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
1bc40 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
1bc50 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
1bc60 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
1bc70 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69  ter:.**.**    wi
1bc80 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a  nShm.pShmNode.**
1bc90 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a      winShm.id.**
1bca0 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
1bcb0 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
1bcc0 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d  ite.  The winShm
1bcd0 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  .pShmNode->mutex
1bce0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
1bcf0 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
1bd00 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
1bd10 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
1bd20 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e  t winShm {.  win
1bd30 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1bd40 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75  e;      /* The u
1bd50 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d  nderlying winShm
1bd60 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
1bd70 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20   winShm *pNext; 
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bd90 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20  ext winShm with 
1bda0 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e  the same winShmN
1bdb0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
1bdc0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
1bdd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
1bde0 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68  olding the winSh
1bdf0 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
1be00 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
1be10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1be20 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
1be30 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
1be40 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
1be50 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1be60 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
1be70 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 20  cks held */.#if 
1be80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1be90 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1bea0 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f  (SQLITE_HAVE_OS_
1beb0 54 52 41 43 45 29 0a 20 20 75 38 20 69 64 3b 20  TRACE).  u8 id; 
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
1bee0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
1bef0 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
1bf00 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1bf10 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
1bf20 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
1bf30 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
1bf40 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
1bf50 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1bf60 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
1bf70 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
1bf80 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
1bf90 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
1bfa0 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
1bfb0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
1bfc0 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
1bfd0 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
1bfe0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
1bff0 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
1c000 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
1c010 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c  #define _SHM_UNL
1c020 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53  CK  1.#define _S
1c030 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
1c040 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20  ine _SHM_WRLCK  
1c050 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
1c060 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
1c070 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
1c080 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
1c090 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
1c0a0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
1c0b0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
1c0c0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
1c0d0 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43      /* _SHM_UNLC
1c0e0 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  K, _SHM_RDLCK, o
1c0f0 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a  r _SHM_WRLCK */.
1c100 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1c110 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1c120 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
1c130 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c  to be locked/unl
1c140 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocked */.  int n
1c150 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
1c160 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1c170 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  tes to lock or u
1c180 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  nlock */.){.  in
1c190 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1c1a0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1c1b0 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c  de form Lock/Unl
1c1c0 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a  ockFileEx() */..
1c1d0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
1c1e0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  he winShmNode ob
1c1f0 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
1c200 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1c210 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1c220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c230 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
1c240 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
1c250 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
1c260 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
1c270 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73  p, lock=%d, offs
1c280 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e  et=%d, size=%d\n
1c290 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
1c2a0 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f  ile->hFile.h, lo
1c2b0 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42  ckType, ofst, nB
1c2c0 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  yte));..  /* Rel
1c2d0 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65  ease/Acquire the
1c2e0 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1c2f0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  ck */.  if( lock
1c300 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
1c310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
1c320 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
1c330 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74  e->hFile.h, ofst
1c340 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
1c350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1c360 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
1c370 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
1c380 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64  s */.    DWORD d
1c390 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c  wFlags = LOCKFIL
1c3a0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
1c3b0 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  LY;.    if( lock
1c3c0 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c  Type == _SHM_WRL
1c3d0 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20  CK ) dwFlags |= 
1c3e0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
1c3f0 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  VE_LOCK;.    rc 
1c400 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
1c410 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64  File->hFile.h, d
1c420 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c  wFlags, ofst, 0,
1c430 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a   nByte, 0);.  }.
1c440 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
1c450 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c460 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
1c470 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1c480 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
1c490 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
1c4a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1c4b0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
1c4c0 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
1c4d0 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d   func=%s, errno=
1c4e0 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  %lu, rc=%s\n",. 
1c4f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1c500 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54  >hFile.h, (lockT
1c510 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43  ype == _SHM_UNLC
1c520 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46  K) ? "winUnlockF
1c530 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20  ile" :.         
1c540 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c    "winLockFile",
1c550 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1c560 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  o, sqlite3ErrNam
1c570 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75  e(rc)));..  retu
1c580 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1c590 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1c5a0 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
1c5b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1c5c0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
1c5d0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
1c5e0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1c5f0 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
1c600 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
1c610 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
1c620 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
1c630 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
1c640 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
1c650 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
1c660 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
1c670 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
1c680 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
1c690 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1c6a0 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
1c6b0 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
1c6c0 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
1c6d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1c6e0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
1c6f0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
1c700 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
1c710 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
1c720 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
1c730 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
1c740 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73  hmNode *p;.  ass
1c750 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
1c760 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52  Held() );.  OSTR
1c770 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
1c780 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46  pid=%lu, deleteF
1c790 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lag=%d\n",.     
1c7a0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1c7b0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64  ntProcessId(), d
1c7c0 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70  eleteFlag));.  p
1c7d0 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c  p = &winShmNodeL
1c7e0 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  ist;.  while( (p
1c7f0 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20   = *pp)!=0 ){.  
1c800 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
1c810 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1c820 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
1c830 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d  tex ){ sqlite3_m
1c840 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
1c850 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72  ex); }.      for
1c860 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1c870 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1c880 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55    BOOL bRc = osU
1c890 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1c8a0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
1c8b0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
1c8c0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
1c8d0 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  UNMAP pid=%lu, r
1c8e0 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
1c8f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c900 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1c910 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
1c920 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
1c930 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1c940 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
1c950 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
1c960 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
1c970 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
1c980 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
1c990 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1c9a0 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45  "SHM-PURGE-CLOSE
1c9b0 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1c9c0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1c9f0 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1ca00 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1ca10 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1ca20 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1ca30 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d  UE(bRc);.      }
1ca40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46  .      if( p->hF
1ca50 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  ile.h!=NULL && p
1ca60 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c  ->hFile.h!=INVAL
1ca70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1ca80 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
1ca90 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1caa0 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
1cab0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
1cac0 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
1cad0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1cae0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1caf0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1cb00 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
1cb10 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1cb20 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1cb30 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(1);.        sq
1cb40 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
1cb50 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1cb60 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
1cb70 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
1cb80 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1cb90 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1cba0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69  oc();.        Si
1cbb0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1cbc0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1cbd0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
1cbe0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
1cbf0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
1cc00 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1cc10 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1cc20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
1cc30 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
1cc40 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1cc50 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
1cc60 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
1cc70 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
1cc80 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1cc90 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
1cca0 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
1ccb0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
1ccc0 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
1ccd0 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
1cce0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
1ccf0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
1cd00 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
1cd10 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
1cd20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
1cd30 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
1cd40 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
1cd50 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
1cd60 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
1cd70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1cd80 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1cd90 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
1cda0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1cdb0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1cdc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1cdd0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1cde0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1cdf0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1ce00 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
1ce10 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1ce20 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1ce30 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce50 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1ce60 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
1ce70 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
1ce80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1ce90 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
1cea0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
1ceb0 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ced0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
1cee0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
1cef0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
1cf00 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
1cf10 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
1cf20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
1cf30 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1cf40 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
1cf50 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
1cf60 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
1cf70 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
1cf80 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1cf90 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
1cfa0 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
1cfb0 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
1cfc0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1cfd0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
1cfe0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1cff0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
1d000 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  T;.  nName = sql
1d010 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
1d020 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
1d030 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
1d040 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1d050 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
1d060 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20  e + 17 );.  if( 
1d070 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
1d080 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1d090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d0a0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
1d0b0 50 54 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  PT;.  }.  pNew->
1d0c0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
1d0d0 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73  r*)&pNew[1];.  s
1d0e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1d0f0 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e  nName+15, pNew->
1d100 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  zFilename, "%s-s
1d110 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1d120 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c  h);.  sqlite3Fil
1d130 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
1d140 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69  zPath, pNew->zFi
1d150 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c  lename);..  /* L
1d160 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  ook to see if th
1d170 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69  ere is an existi
1d180 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68  ng winShmNode th
1d190 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  at can be used..
1d1a0 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68    ** If no match
1d1b0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63  ing winShmNode c
1d1c0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
1d1d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1d1e0 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  e..  */.  winShm
1d1f0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1d200 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77  for(pShmNode = w
1d210 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70  inShmNodeList; p
1d220 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64  ShmNode; pShmNod
1d230 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78  e=pShmNode->pNex
1d240 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e  t){.    /* TBD n
1d250 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77  eed to come up w
1d260 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68  ith better match
1d270 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a   here.  Perhaps.
1d280 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f      ** use FILE_
1d290 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f  ID_BOTH_DIR_INFO
1d2a0 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   Structure..    
1d2b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1d2c0 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f  e3StrICmp(pShmNo
1d2d0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  de->zFilename, p
1d2e0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d  New->zFilename)=
1d2f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
1d300 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
1d310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1d320 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
1d330 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  e{.    pShmNode 
1d340 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
1d350 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46   = 0;.    ((winF
1d360 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d  ile*)(&pShmNode-
1d370 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e  >hFile))->h = IN
1d380 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1d390 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  UE;.    pShmNode
1d3a0 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d  ->pNext = winShm
1d3b0 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69  NodeList;.    wi
1d3c0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70  nShmNodeList = p
1d3d0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53  ShmNode;..    pS
1d3e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
1d3f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1d400 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1d410 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
1d420 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
1d430 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1d440 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1d450 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1d460 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1d470 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
1d480 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
1d490 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
1d4a0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1d4b0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
1d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1d4d0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
1d4e0 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
1d4f0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1d500 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
1d510 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
1d520 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
1d530 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1d540 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1d550 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
1d560 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1d570 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1d580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d590 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53     0);.    if( S
1d5a0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1d5b0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1d5c0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1d5d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1d5e0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1d5f0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1d600 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1d610 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
1d620 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
1d630 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1d640 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20  length..    */. 
1d650 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73     if( winShmSys
1d660 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1d670 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  , _SHM_WRLCK, WI
1d680 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
1d690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d6a0 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
1d6b0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
1d6c0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1d6d0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
1d6e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d700 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1d710 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1d720 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1d730 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1d750 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
1d760 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1d770 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1d780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d790 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
1d7a0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1d7b0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1d7c0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1d7d0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1d7e0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1d7f0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1d800 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1d810 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1d820 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1d830 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
1d840 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1d850 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1d860 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
1d870 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
1d880 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1d890 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1d8a0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1d8b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
1d8c0 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 70  VE_OS_TRACE).  p
1d8d0 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
1d8e0 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
1d8f0 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
1d900 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
1d910 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69  ->pShm = p;.  wi
1d920 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1d930 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
1d940 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
1d950 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
1d960 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
1d970 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
1d980 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
1d990 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1d9a0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
1d9b0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
1d9c0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
1d9d0 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65  uct winShm) obje
1d9e0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
1d9f0 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
1da00 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
1da10 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
1da20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
1da30 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
1da40 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
1da50 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
1da60 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
1da70 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
1da80 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
1da90 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
1daa0 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  ex.  ** mutex.. 
1dab0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1dac0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1dad0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
1dae0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
1daf0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
1db00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
1db10 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
1db20 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1db30 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1db40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1db50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
1db60 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
1db70 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
1db80 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1db90 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
1dba0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
1dbb0 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
1dbc0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1dbd0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
1dbe0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
1dbf0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
1dc00 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1dc10 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
1dc20 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1dc30 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1dc40 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
1dc50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1dc60 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1dc70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
1dc80 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
1dc90 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67  rlying.** storag
1dca0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
1dcb0 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
1dcc0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
1dcd0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1dce0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1dcf0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1dd00 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
1dd10 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
1dd20 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
1dd30 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
1dd40 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
1dd50 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
1dd60 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
1dd70 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1dd80 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
1dd90 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
1dda0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1ddb0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1ddc0 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
1ddd0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1dde0 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
1ddf0 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
1de00 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1de10 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
1de20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1de30 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
1de40 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
1de50 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
1de60 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
1de70 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1de80 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1de90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1dea0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1deb0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
1dec0 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
1ded0 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
1dee0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
1def0 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
1df00 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
1df10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1df20 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1df30 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
1df40 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
1df50 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
1df60 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
1df70 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
1df80 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
1df90 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
1dfa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1dfb0 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
1dfc0 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
1dfd0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1dfe0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1dff0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
1e000 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
1e010 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
1e020 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
1e030 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
1e040 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
1e050 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1e060 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
1e070 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
1e080 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
1e090 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
1e0a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1e0b0 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
1e0c0 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
1e0d0 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
1e0e0 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
1e0f0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
1e100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e110 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1e120 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
1e130 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
1e140 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
1e150 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
1e160 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
1e170 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1e180 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1e190 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
1e1a0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1e1b0 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e1d0 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
1e1e0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1e1f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
1e220 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
1e230 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1e240 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
1e250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
1e260 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
1e270 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
1e280 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
1e290 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
1e2a0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1e2b0 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
1e2c0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
1e2d0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1e2e0 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1e2f0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
1e300 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
1e310 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
1e320 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e340 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1e350 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
1e360 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1e370 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
1e380 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1e390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1e3c0 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1e3f0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
1e400 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
1e410 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
1e420 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
1e430 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
1e440 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
1e450 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1e460 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1e470 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1e480 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1e490 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1e4a0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1e4b0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1e4c0 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
1e4d0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1e4e0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1e4f0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1e500 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1e510 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1e520 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1e530 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
1e540 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1e550 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1e560 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1e570 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1e580 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
1e590 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
1e5a0 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
1e5b0 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1e5c0 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1e5d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1e5e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1e5f0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1e600 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1e610 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1e620 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1e630 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1e640 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1e650 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1e660 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1e670 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1e680 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1e690 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1e6a0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1e6b0 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1e6c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e6d0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1e6e0 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1e6f0 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1e700 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1e710 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1e720 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1e730 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1e740 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1e750 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1e760 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1e770 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1e780 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1e790 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1e7a0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
1e7b0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1e7c0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1e7d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e7e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1e7f0 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1e800 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1e810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1e830 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1e840 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1e850 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1e860 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1e870 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1e880 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1e890 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1e8a0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1e8b0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1e8c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1e8d0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1e8e0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1e8f0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1e900 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1e910 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1e920 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1e930 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1e940 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1e950 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1e960 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1e970 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1e980 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1e990 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1e9a0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1e9b0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1e9c0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1e9d0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1e9e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e9f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ea00 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1ea10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1ea20 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1ea30 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1ea40 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1ea50 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1ea60 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1ea70 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1ea80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ea90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1eaa0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1eab0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1eac0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1ead0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1eae0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1eaf0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1eb00 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1eb10 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1eb20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1eb30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1eb40 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
1eb50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
1eb60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1eb70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1eb80 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1eb90 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1eba0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
1ebb0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1ebc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1ebd0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1ebe0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
1ebf0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
1ec00 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
1ec10 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
1ec20 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
1ec30 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1ec40 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1ec50 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1ec60 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1ec70 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
1ec80 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
1ec90 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1eca0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ecb0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1ecc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ecd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1ece0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
1ecf0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1ed00 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
1ed10 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
1ed20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
1ed30 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
1ed40 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
1ed50 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
1ed60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ed70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1ed80 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1ed90 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1eda0 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_WRLCK, ofst+WI
1edb0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1edc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1edd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ede0 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
1edf0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1ee00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1ee10 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
1ee20 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
1ee30 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1ee40 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1ee50 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1ee60 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1ee70 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d  OCK pid=%lu, id=
1ee80 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25  %d, sharedMask=%
1ee90 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30  03x, exclMask=%0
1eea0 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  3x, rc=%s\n",.  
1eeb0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1eec0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1eed0 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72  , p->id, p->shar
1eee0 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
1eef0 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
1ef00 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1ef10 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
1ef20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
1ef30 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
1ef40 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
1ef50 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
1ef60 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41   memory..**.** A
1ef70 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
1ef80 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
1ef90 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
1efa0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
1efb0 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
1efc0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
1efd0 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
1efe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1eff0 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  inShmBarrier(.  
1f000 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1f010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1f020 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
1f030 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1f040 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
1f050 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1f060 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72  sqlite3MemoryBar
1f070 72 69 65 72 28 29 3b 20 20 20 2f 2a 20 63 6f 6d  rier();   /* com
1f080 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65  piler-defined me
1f090 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a  mory barrier */.
1f0a0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1f0b0 65 78 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  ex();       /* A
1f0c0 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
1f0d0 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 77  edundancy */.  w
1f0e0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1f0f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1f100 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f110 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
1f120 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
1f130 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
1f140 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
1f150 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1f160 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
1f170 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
1f180 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a  emory regions.**
1f190 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1f1a0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1f1b0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
1f1c0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
1f1d0 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73  zRegion.** bytes
1f1e0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1f1f0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1f200 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1f210 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1f220 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1f230 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1f240 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
1f250 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
1f260 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1f270 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1f280 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1f290 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1f2a0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1f2b0 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1f2c0 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1f2d0 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1f2e0 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1f2f0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1f300 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1f310 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57  urned. If.** isW
1f320 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1f330 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1f340 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1f350 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1f360 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  yet.** been allo
1f370 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
1f380 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
1f390 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1f3a0 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
1f3b0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
1f3c0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
1f3d0 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
1f3e0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
1f3f0 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
1f400 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
1f410 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
1f420 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 0a   this processes.
1f430 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
1f440 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1f450 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
1f460 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1f470 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65  the mapped.** me
1f480 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
1f490 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
1f4a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1f4b0 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
1f4c0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1f4d0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1f4e0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
1f4f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1f500 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f520 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
1f530 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
1f540 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1f550 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1f560 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
1f570 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20  int isWrite,    
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
1f5a0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
1f5b0 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
1f5c0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
1f5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1f5e0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
1f5f0 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1f600 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1f610 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a  *)fd;.  winShm *
1f620 70 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53  pShm = pDbFd->pS
1f630 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1f640 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1f650 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f660 3b 0a 0a 20 20 69 66 28 20 21 70 53 68 6d 20 29  ;..  if( !pShm )
1f670 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
1f680 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1f690 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1f6a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f6b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 53  eturn rc;.    pS
1f6c0 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  hm = pDbFd->pShm
1f6d0 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65  ;.  }.  pShmNode
1f6e0 20 3d 20 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64   = pShm->pShmNod
1f6f0 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
1f700 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1f710 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
1f720 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
1f730 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1f740 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
1f750 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
1f760 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1f770 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1f780 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
1f790 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
1f7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1f7b0 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
1f7c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
1f7d0 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
1f7e0 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
1f7f0 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
1f800 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1f810 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
1f820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f830 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
1f840 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
1f850 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
1f860 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1f870 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
1f880 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1f890 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
1f8a0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
1f8b0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1f8c0 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
1f8d0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1f8e0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
1f8f0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
1f900 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
1f910 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
1f920 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
1f930 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
1f940 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
1f950 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
1f960 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1f970 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1f980 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
1f990 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f9a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f9b0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1f9c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1f9d0 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
1f9e0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fa00 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
1fa10 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1fa20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1fa30 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
1fa40 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
1fa50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
1fa60 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1fa70 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
1fa80 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
1fa90 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
1faa0 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
1fab0 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
1fac0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1fad0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1fae0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1faf0 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
1fb00 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
1fb10 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
1fb20 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1fb30 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
1fb40 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1fb50 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
1fb60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1fb70 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
1fb80 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1fb90 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1fba0 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1fbb0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1fbc0 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
1fbd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fbf0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1fc00 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1fc10 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
1fc20 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
1fc50 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1fc60 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1fc70 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1fc80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fc90 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
1fca0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1fcb0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
1fcc0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
1fcd0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
1fce0 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
1fcf0 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
1fd00 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20  realloc64(.     
1fd10 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1fd20 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
1fd30 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
1fd40 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
1fd50 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
1fd60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1fd70 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1fd80 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1fd90 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1fda0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1fdb0 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1fdc0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1fdd0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1fde0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1fdf0 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1fe00 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1fe10 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1fe20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1fe30 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1fe40 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1fe50 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1fe60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1fe70 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
1fe80 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1fe90 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
1fea0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1feb0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1fec0 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1fed0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1fee0 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1fef0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1ff00 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
1ff10 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1ff20 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
1ff30 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
1ff40 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1ff50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1ff60 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1ff70 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
1ff80 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1ff90 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53  2_HAS_ANSI) && S
1ffa0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41  QLITE_WIN32_CREA
1ffb0 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20  TEFILEMAPPINGA. 
1ffc0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1ffd0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1ffe0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1fff0 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
20000 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
20010 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
20020 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
20030 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
20040 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
20050 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
20060 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
20070 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
20080 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20090 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
200a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
200b0 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
200c0 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
200d0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
200e0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
200f0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
20100 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
20110 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
20120 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
20130 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
20140 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
20150 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
20160 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
20170 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
20180 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
20190 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
201a0 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
201b0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
201c0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
201d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
201e0 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
201f0 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
20200 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
20210 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
20220 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
20230 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
20240 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
20250 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
20260 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
20270 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
20280 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
20290 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
202a0 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  t.        );.#en
202b0 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52  dif.        OSTR
202c0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41  ACE(("SHM-MAP-MA
202d0 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
202e0 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  n=%d, offset=%d,
202f0 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
20300 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
20310 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20320 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
20330 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
20340 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
20350 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
20360 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
20370 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
20380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20390 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
203a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
203b0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
203c0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
203d0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
203e0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
203f0 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
20400 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
20430 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  3", pDbFd->zPath
20440 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68  );.        if( h
20450 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e  Map ) osCloseHan
20460 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20  dle(hMap);.     
20470 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
20480 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
20490 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
204a0 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
204b0 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20  nRegion].pMap = 
204c0 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMap;.      pShm
204d0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
204e0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
204f0 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  .hMap = hMap;.  
20500 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
20510 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
20520 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
20530 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
20540 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
20550 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
20560 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a  set = iRegion*sz
20570 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  Region;.    int 
20580 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
20590 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
205a0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
205b0 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20  Granularity;.   
205c0 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
205d0 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65   *)pShmNode->aRe
205e0 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d  gion[iRegion].pM
205f0 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76  ap;.    *pp = (v
20600 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74  oid *)&p[iOffset
20610 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  Shift];.  }else{
20620 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
20630 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
20640 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
20650 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
20660 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  rn rc;.}..#else.
20670 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d  # define winShmM
20680 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
20690 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20  e winShmLock    
206a0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
206b0 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
206c0 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20  ine winShmUnmap 
206d0 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
206e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
206f0 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
20700 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61  Cleans up the ma
20710 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74  pped region of t
20720 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
20730 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69  e, if any..*/.#i
20740 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
20750 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
20760 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
20770 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
20780 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
20790 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
207a0 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
207b0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
207c0 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52  , hMap=%p, pMapR
207d0 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
207e0 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65         "mmapSize
207f0 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41  =%lld, mmapSizeA
20800 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70  ctual=%lld, mmap
20810 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c  SizeMax=%lld\n",
20820 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20830 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20840 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
20850 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e  e->hMap, pFile->
20860 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20  pMapRegion,.    
20870 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
20880 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d  apSize, pFile->m
20890 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70  mapSizeActual, p
208a0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
208b0 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x));.  if( pFile
208c0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
208d0 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
208e0 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
208f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
20900 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
20910 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
20920 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
20930 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
20940 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
20950 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
20960 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
20970 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
20980 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
20990 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
209a0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
209b0 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
209c0 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
209d0 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
209e0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
209f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
20a00 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
20a10 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20a30 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20  winUnmapfile1", 
20a40 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
20a50 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
20a60 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
20a70 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
20a80 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
20a90 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
20aa0 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
20ab0 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
20ac0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
20ad0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
20ae0 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
20af0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
20b00 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
20b10 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
20b20 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
20b30 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
20b40 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
20b50 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
20b60 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
20b70 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20b80 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20b90 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
20ba0 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
20bb0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
20bc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
20bd0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
20be0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
20c00 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70  inUnmapfile2", p
20c10 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
20c20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68    }.    pFile->h
20c30 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Map = NULL;.  }.
20c40 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
20c50 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
20c60 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
20c70 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
20c80 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20c90 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
20ca0 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
20cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20cc0 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
20cd0 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
20ce0 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
20cf0 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
20d00 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
20d10 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
20d20 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
20d30 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
20d40 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
20d50 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65   Or, if.** there
20d60 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
20d70 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
20d80 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
20d90 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20  re are still.** 
20da0 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
20db0 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
20dc0 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
20dd0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
20de0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
20df0 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
20e00 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
20e10 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
20e20 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ted size of.** t
20e30 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
20e40 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
20e50 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
20e60 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
20e70 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  n the.** request
20e80 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
20e90 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
20ea0 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
20eb0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
20ec0 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
20ed0 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
20ee0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
20ef0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
20f00 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67  figured.** using
20f10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
20f20 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76  AP_SIZE, whichev
20f30 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
20f40 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
20f50 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
20f60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
20f70 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
20f80 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
20f90 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
20fa0 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
20fb0 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
20fc0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
20fd0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
20fe0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
20ff0 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
21000 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  File *pFd, sqlit
21010 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
21020 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
21030 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
21040 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
21050 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
21060 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
21070 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
21080 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
21090 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65  , pFile=%p, size
210a0 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
210b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
210c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
210d0 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69  d, nByte));..  i
210e0 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
210f0 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
21100 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
21110 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  Map<0 ){.    rc 
21120 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
21130 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64  qlite3_file*)pFd
21140 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66  , &nMap);.    if
21150 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53  ( rc ){.      OS
21160 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
21170 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
21180 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
21190 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20  ERR_FSTAT\n",.  
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
211b0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
211c0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20  Id(), pFd));.   
211d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
211e0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
211f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d    }.  }.  if( nM
21200 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
21210 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
21220 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
21230 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26  ax;.  }.  nMap &
21240 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ~(sqlite3_int6
21250 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  4)(winSysInfo.dw
21260 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a  PageSize - 1);..
21270 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26    if( nMap==0 &&
21280 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30   pFd->mmapSize>0
21290 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   ){.    winUnmap
212a0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20  file(pFd);.  }. 
212b0 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
212c0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
212d0 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  void *pNew = 0;.
212e0 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63      DWORD protec
212f0 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c  t = PAGE_READONL
21300 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61  Y;.    DWORD fla
21310 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45  gs = FILE_MAP_RE
21320 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61  AD;..    winUnma
21330 70 66 69 6c 65 28 70 46 64 29 3b 0a 23 69 66 64  pfile(pFd);.#ifd
21340 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ef SQLITE_MMAP_R
21350 45 41 44 57 52 49 54 45 0a 20 20 20 20 69 66 28  EADWRITE.    if(
21360 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
21370 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
21380 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  Y)==0 ){.      p
21390 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
213a0 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66  ADWRITE;.      f
213b0 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50  lags |= FILE_MAP
213c0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 65  _WRITE;.    }.#e
213d0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
213e0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64  OS_WINRT.    pFd
213f0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
21400 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
21410 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  App(pFd->h, NULL
21420 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c  , protect, nMap,
21430 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
21440 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
21450 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
21460 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
21470 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
21480 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  W(pFd->h, NULL, 
21490 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
214c0 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
214d0 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
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 20 20 20 20 28 44 57 4f 52             (DWOR
21500 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
21510 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
21520 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
21530 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
21540 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  I) && SQLITE_WIN
21550 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50  32_CREATEFILEMAP
21560 50 49 4e 47 41 0a 20 20 20 20 70 46 64 2d 3e 68  PINGA.    pFd->h
21570 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
21580 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e  leMappingA(pFd->
21590 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
215a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
215d0 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
215e0 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
21610 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
21620 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
21630 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d    if( pFd->hMap=
21640 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  =NULL ){.      p
21650 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
21660 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21670 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
21680 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
21690 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
216a0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22     "winMapfile1"
216d0 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
216e0 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
216f0 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
21700 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
21710 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
21720 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
21730 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
21740 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25  ILE-CREATE pid=%
21750 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
21760 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
21770 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
21780 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
21790 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
217a0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
217b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
217c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  K;.    }.    ass
217d0 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e  ert( (nMap % win
217e0 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
217f0 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ze)==0 );.    as
21800 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a  sert( sizeof(SIZ
21810 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c  E_T)==sizeof(sql
21820 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e  ite3_int64) || n
21830 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20  Map<=0xffffffff 
21840 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
21850 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20  _WINRT.    pNew 
21860 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
21870 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d  eFromApp(pFd->hM
21880 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53  ap, flags, 0, (S
21890 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c  IZE_T)nMap);.#el
218a0 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
218b0 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
218c0 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
218d0 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d  0, 0, (SIZE_T)nM
218e0 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ap);.#endif.    
218f0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
21900 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
21910 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29  andle(pFd->hMap)
21920 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61  ;.      pFd->hMa
21930 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  p = NULL;.      
21940 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
21950 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
21960 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
21970 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
21980 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
21990 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32      "winMapfile2
219c0 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
219d0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
219e0 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
219f0 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
21a00 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
21a10 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
21a20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
21a30 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75  FILE-MAP pid=%lu
21a40 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
21a50 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
21a60 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21a70 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
21a80 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
21a90 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
21aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21ab0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
21ac0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
21ad0 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  w;.    pFd->mmap
21ae0 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  Size = nMap;.   
21af0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
21b00 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d  tual = nMap;.  }
21b10 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ..  OSTRACE(("MA
21b20 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
21b30 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
21b40 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
21b50 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
21b60 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
21b70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Fd));.  return S
21b80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
21b90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
21ba0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
21bb0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62  ./*.** If possib
21bc0 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  le, return a poi
21bd0 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
21be0 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61  g of file fd sta
21bf0 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a  rting at offset.
21c00 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70  ** iOff. The map
21c10 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c  ping must be val
21c20 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  id for at least 
21c30 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  nAmt bytes..**.*
21c40 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e  * If such a poin
21c50 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69  ter can be obtai
21c60 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e  ned, store it in
21c70 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20   *pp and return 
21c80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72  SQLITE_OK..** Or
21c90 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  , if one cannot 
21ca0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
21cb0 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  urs, set *pp to 
21cc0 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
21cd0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c  ITE_OK..** Final
21ce0 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
21cf0 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75  does occur, retu
21d00 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
21d10 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
21d20 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a  al.** value of *
21d30 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  pp is undefined 
21d40 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
21d50 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
21d60 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e  tion does return
21d70 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20   a pointer, the 
21d80 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e  caller must even
21d90 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73  tually.** releas
21da0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
21db0 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e  by calling winUn
21dc0 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
21dd0 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28  ic int winFetch(
21de0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21df0 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
21e00 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
21e10 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
21e20 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
21e30 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77  inFile *pFd = (w
21e40 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a  inFile*)fd;   /*
21e50 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
21e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
21e70 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
21e80 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
21e90 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
21ea0 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
21eb0 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  %lld, amount=%d,
21ec0 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20   pp=%p\n",.     
21ed0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
21ee0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
21ef0 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70  d, iOff, nAmt, p
21f00 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  p));..#if SQLITE
21f10 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
21f20 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
21f30 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
21f40 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
21f50 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
21f60 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70   int rc = winMap
21f70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
21f80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21fa0 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
21fb0 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
21fc0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fe0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
21ff0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
22000 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
22010 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
22020 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
22030 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
22040 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
22050 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
22060 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
22070 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
22080 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
22090 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
220a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
220b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
220c0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
220d0 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70  e=%p, pp=%p, *pp
220e0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
220f0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
22100 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22110 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70  cessId(), fd, pp
22120 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72  , *pp));.  retur
22130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22140 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
22150 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
22160 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
22170 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
22180 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65  ases a.** refere
22190 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
221a0 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
221b0 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54  to winFetch(). T
221c0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
221d0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
221e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
221f0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
22200 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
22210 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
22220 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
22230 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28  to the winFetch(
22240 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ) invocation..**
22250 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
22260 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
22270 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
22280 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
22290 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20  ng called.** to 
222a0 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
222b0 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
222c0 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
222d0 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
222e0 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ing.** may now b
222f0 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
22300 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
22310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22320 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74  winUnfetch(sqlit
22330 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
22340 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
22350 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
22360 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
22370 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
22380 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
22390 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
223a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
223b0 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
223c0 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
223d0 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
223e0 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
223f0 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65  tanding.  ** xFe
22400 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
22410 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
22420 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
22430 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
22440 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
22450 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
22460 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
22470 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
22480 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
22490 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
224a0 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
224b0 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
224c0 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
224d0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
224e0 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
224f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
22500 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
22510 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
22520 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
22530 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
22540 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22550 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22560 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
22570 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
22580 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
22590 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
225a0 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
225b0 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
225c0 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
225d0 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
225e0 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
225f0 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
22600 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
22610 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
22620 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
22630 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
22640 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
22650 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20  an be omitted - 
22660 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72  potentially impr
22670 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72  oving.    ** per
22680 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20  formance.  */.  
22690 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
226a0 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
226b0 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
226c0 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ut>=0 );.#endif.
226d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
226e0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
226f0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
22700 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
22710 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22720 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29  ProcessId(), fd)
22730 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22750 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
22760 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
22770 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
22780 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
22790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227a0 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
227b0 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
227c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
227e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
22830 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20  .** This vector 
22840 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
22850 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
22860 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a   operate on an.*
22870 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66  * sqlite3_file f
22880 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61  or win32..*/.sta
22890 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
228a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e  3_io_methods win
228b0 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33  IoMethod = {.  3
228c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
228e0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
228f0 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  winClose,       
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77  /* xClose */.  w
22920 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  inRead,         
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22940 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e  * xRead */.  win
22950 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22970 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54  xWrite */.  winT
22980 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
22990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
229a0 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69  Truncate */.  wi
229b0 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  nSync,          
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229d0 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46   xSync */.  winF
229e0 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
229f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22a00 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69  FileSize */.  wi
22a10 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nLock,          
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a30 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55   xLock */.  winU
22a40 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
22a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22a60 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43  Unlock */.  winC
22a70 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
22a80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
22a90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
22aa0 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f  k */.  winFileCo
22ab0 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
22ac0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
22ad0 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53  ontrol */.  winS
22ae0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
22af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22b00 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
22b10 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
22b20 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20  eristics,       
22b30 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63  /* xDeviceCharac
22b40 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77  teristics */.  w
22b50 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  inShmMap,       
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b70 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77  * xShmMap */.  w
22b80 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  inShmLock,      
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ba0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20  * xShmLock */.  
22bb0 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20  winShmBarrier,  
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
22be0 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c  /.  winShmUnmap,
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
22c10 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20   */.  winFetch, 
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
22c40 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20  */.  winUnfetch 
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68       /* xUnfetch
22c70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   */.};../*******
22c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cc0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
22cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ce0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
22cf0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
22d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d10 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
22d20 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
22d30 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
22d40 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
22d50 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
22d60 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
22d70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
22d80 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43  YGWIN__)./*.** C
22d90 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d  onvert a filenam
22da0 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20  e from whatever 
22db0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
22dc0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a  perating system.
22dd0 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20  ** supports for 
22de0 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55  filenames into U
22df0 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
22e00 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20  hold the result 
22e10 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
22e20 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
22e30 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
22e40 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
22e50 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
22e60 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74  char *winConvert
22e70 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  ToUtf8Filename(c
22e80 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
22e90 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
22ea0 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
22eb0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
22ec0 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
22ed0 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
22ee0 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  f8(zFilename);. 
22ef0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
22f00 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
22f10 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e    else{.    zCon
22f20 76 65 72 74 65 64 20 3d 20 77 69 6e 4d 62 63 73  verted = winMbcs
22f30 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65  ToUtf8(zFilename
22f40 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  , osAreFileApisA
22f50 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  NSI());.  }.#end
22f60 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
22f70 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
22f80 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
22f90 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
22fa0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22fb0 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
22fc0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
22fd0 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
22fe0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
22ff0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
23000 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
23010 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
23020 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
23030 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
23040 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
23050 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
23060 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
23070 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
23080 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72   void *winConver
23090 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
230a0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
230b0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
230c0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
230d0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
230e0 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
230f0 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  ed = winUtf8ToUn
23100 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
23110 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
23120 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
23130 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
23140 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55  Converted = winU
23150 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e  tf8ToMbcs(zFilen
23160 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  ame, osAreFileAp
23170 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23  isANSI());.  }.#
23180 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
23190 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
231a0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
231b0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
231c0 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
231d0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
231e0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
231f0 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46  he specified UTF
23200 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72  -8 string buffer
23210 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20  .** ends with a 
23220 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
23230 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f 72  tor character or
23240 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73 73   one was success
23250 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74  fully.** added t
23260 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o it..*/.static 
23270 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  int winMakeEndIn
23280 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c  DirSep(int nBuf,
23290 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
232a0 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20  if( zBuf ){.    
232b0 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74  int nLen = sqlit
232c0 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
232d0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30  ;.    if( nLen>0
232e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69   ){.      if( wi
232f0 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e  nIsDirSep(zBuf[n
23300 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
23310 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
23320 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65     }else if( nLe
23330 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20  n+1<nBuf ){.    
23340 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d      zBuf[nLen] =
23350 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b   winGetDirSep();
23360 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c  .        zBuf[nL
23370 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  en+1] = '\0';.  
23380 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
23390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
233a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
233b0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
233c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
233d0 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ame and store th
233e0 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e  e resulting poin
233f0 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a  ter into pzBuf..
23400 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
23410 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66  eturned in pzBuf
23420 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76   must be freed v
23430 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ia sqlite3_free(
23440 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23450 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
23460 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23470 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29  s, char **pzBuf)
23480 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
23490 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
234a0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
234b0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
234c0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
234d0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
234e0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
234f0 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
23500 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74  int nPre = sqlit
23510 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54  e3Strlen30(SQLIT
23520 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
23530 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c  IX);.  int nMax,
23540 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65   nBuf, nDir, nLe
23550 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  n;.  char *zBuf;
23560 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
23570 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
23580 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
23590 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
235a0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
235b0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
235c0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
235d0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
235e0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
235f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
23600 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ing..  */.  Simu
23610 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
23620 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
23630 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
23640 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  te a temporary b
23650 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
23660 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
23670 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d  ed file.  ** nam
23680 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  e for the tempor
23690 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ary file.  If th
236a0 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e  is fails, we can
236b0 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20  not continue..  
236c0 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73  */.  nMax = pVfs
236d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42  ->mxPathname; nB
236e0 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20  uf = nMax + 2;. 
236f0 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d   zBuf = sqlite3M
23700 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20  allocZero( nBuf 
23710 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29  );.  if( !zBuf )
23720 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
23730 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23740 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
23750 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  MEM\n"));.    re
23760 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
23770 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
23780 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
23790 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
237a0 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
237b0 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68  tory.  First, ch
237c0 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  eck if one.  ** 
237d0 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69  has been explici
237e0 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61  tly set by the a
237f0 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65  pplication; othe
23800 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f  rwise, use the o
23810 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  ne.  ** configur
23820 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74  ed by the operat
23830 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ing system..  */
23840 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d  .  nDir = nMax -
23850 20 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20   (nPre + 15);.  
23860 61 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29  assert( nDir>0 )
23870 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
23880 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
23890 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65  {.    int nDirLe
238a0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
238b0 6e 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  n30(sqlite3_temp
238c0 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
238d0 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29   if( nDirLen>0 )
238e0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 77 69 6e  {.      if( !win
238f0 49 73 44 69 72 53 65 70 28 73 71 6c 69 74 65 33  IsDirSep(sqlite3
23900 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b  _temp_directory[
23910 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20  nDirLen-1]) ){. 
23920 20 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b         nDirLen++
23930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23940 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72  if( nDirLen>nDir
23950 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23960 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23970 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
23980 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
23990 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
239a0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  n"));.        re
239b0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
239c0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
239d0 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
239e0 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e1", 0);.      }
239f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
23a00 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
23a10 75 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  uf, "%s", sqlite
23a20 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
23a30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  );.    }.  }.#if
23a40 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
23a50 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20  N__).  else{.   
23a60 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
23a70 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
23a80 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
23a90 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
23aa0 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  DIR") */.       
23ab0 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d  0, /* getenv("TM
23ac0 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
23ad0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
23ae0 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
23af0 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d  , /* getenv("TEM
23b00 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  P") */.       0,
23b10 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52   /* getenv("USER
23b20 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20  PROFILE") */.   
23b30 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
23b40 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70         "/usr/tmp
23b50 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22  ",.       "/tmp"
23b60 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20  ,.       ".",.  
23b70 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
23b80 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
23b90 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
23ba0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
23bb0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23bc0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Dir = 0;..    if
23bd0 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
23be0 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
23bf0 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
23c00 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
23c10 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
23c20 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
23c30 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
23c40 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69  azDirs[2] ) azDi
23c50 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[2] = getenv("
23c60 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21  TMP");.    if( !
23c70 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69  azDirs[3] ) azDi
23c80 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[3] = getenv("
23c90 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  TEMP");.    if( 
23ca0 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44  !azDirs[4] ) azD
23cb0 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28  irs[4] = getenv(
23cc0 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a  "USERPROFILE");.
23cd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
23ce0 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
23cf0 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
23d00 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
23d10 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  ]){.      void *
23d20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
23d30 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
23d40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23d50 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73  /* If the path s
23d60 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
23d70 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77  ve letter follow
23d80 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a  ed by the colon.
23d90 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74        ** charact
23da0 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73  er, assume it is
23db0 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76   already a nativ
23dc0 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74  e Win32 path; ot
23dd0 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
23de0 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e  * it must be con
23df0 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69  verted to a nati
23e00 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 76 69  ve Win32 path vi
23e10 61 20 74 68 65 20 43 79 67 77 69 6e 20 41 50 49  a the Cygwin API
23e20 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20  .      ** prior 
23e30 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20  to using it..   
23e40 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
23e50 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
23e60 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29  AndColon(zDir) )
23e70 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65  {.        zConve
23e80 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
23e90 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
23ea0 65 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  e(zDir);.       
23eb0 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64   if( !zConverted
23ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
23ed0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
23ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52  ;.          OSTR
23ef0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
23f00 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
23f10 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
23f20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23f30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
23f40 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
23f50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23f60 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
23f70 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
23f80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23f90 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
23fa0 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  %s", zDir);.    
23fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23fc0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
23fd0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23ff0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24000 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
24010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24020 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
24030 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
24040 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20  ( nMax+1 );.    
24050 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
24060 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
24070 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
24080 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
24090 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
240a0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
240b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
240c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
240d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
240e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
240f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
24100 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
24110 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
24120 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20       osIsNT() ? 
24130 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
24140 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
24150 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20  O_WIN_A, zDir,. 
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24170 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b  Converted, nMax+
24180 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1)<0 ){.        
24190 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
241a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
241b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
241c0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
241d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
241e0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
241f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
24200 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20  PATH\n"));.     
24210 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
24220 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24230 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OERR_CONVPATH, (
24240 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24260 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
24270 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69  tTempname2", zDi
24280 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
24290 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
242a0 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
242b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
242c0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
242d0 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64   know the candid
242e0 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78  ate directory ex
242f0 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a  ists and should.
24300 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
24310 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  used.  However, 
24320 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63  we may need to c
24330 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e  onvert the strin
24340 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  g containing.   
24350 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61         ** its na
24360 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69  me into UTF-8 (i
24370 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46  .e. if it is UTF
24380 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a  -16 right now)..
24390 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
243a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74         char *zUt
243b0 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
243c0 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43  oUtf8Filename(zC
243d0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
243e0 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
243f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
24400 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24410 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
24420 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24430 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
24440 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
24450 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
24460 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24470 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
24480 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24490 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
244a0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
244b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
244c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
244d0 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55  , zBuf, "%s", zU
244e0 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tf8);.          
244f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
24500 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f8);.          s
24510 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24520 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
24530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24540 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
24550 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24560 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ted);.      }.  
24570 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53    }.  }.#elif !S
24580 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
24590 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
245a0 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  WIN__).  else if
245b0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
245c0 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
245d0 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
245e0 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
245f0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73  llocZero( nMax*s
24600 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
24610 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61      if( !zWidePa
24620 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
24630 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
24640 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
24650 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
24660 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
24670 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
24680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
24690 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
246a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
246b0 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61  GetTempPathW(nMa
246c0 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  x, zWidePath)==0
246d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
246e0 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
246f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24700 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
24710 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
24720 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
24730 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
24740 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
24750 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
24760 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
24770 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
24780 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
24790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
247a0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
247b0 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29  etTempname2", 0)
247c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c  ;.    }.    zMul
247d0 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ti = winUnicodeT
247e0 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
247f0 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
24800 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24810 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
24820 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75   zBuf, "%s", zMu
24830 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
24840 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
24850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24860 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
24870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24880 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24890 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
248a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
248b0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
248c0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
248d0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
248e0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
248f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24900 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
24910 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
24920 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
24930 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
24940 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
24950 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tf8;.    char *z
24960 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74  MbcsPath = sqlit
24970 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
24980 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ax );.    if( !z
24990 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20  MbcsPath ){.    
249a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
249b0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
249c0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
249d0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
249e0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
249f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24a00 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
24a10 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
24a20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
24a30 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61  hA(nMax, zMbcsPa
24a40 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
24a50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
24a60 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
24a70 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
24a80 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
24a90 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
24aa0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
24ab0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
24ac0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
24ad0 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
24ae0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
24b10 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e3", 0);.    }. 
24b20 20 20 20 7a 55 74 66 38 20 3d 20 77 69 6e 4d 62     zUtf8 = winMb
24b30 63 73 54 6f 55 74 66 38 28 7a 4d 62 63 73 50 61  csToUtf8(zMbcsPa
24b40 74 68 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69  th, osAreFileApi
24b50 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 69 66  sANSI());.    if
24b60 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
24b70 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24b80 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
24b90 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
24ba0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24bb0 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Utf8);.    }else
24bc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24bd0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
24be0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
24bf0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
24c00 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
24c10 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
24c20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24c30 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24c40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
24c50 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
24c60 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20  _ANSI */.#endif 
24c70 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  /* !SQLITE_OS_WI
24c80 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  NRT */..  /*.  *
24c90 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
24ca0 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  sure the tempora
24cb0 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64  ry directory end
24cc0 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70  s with an approp
24cd0 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72  riate.  ** separ
24ce0 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65  ator.  If it doe
24cf0 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20  s not and there 
24d00 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70  is not enough sp
24d10 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a  ace left to add.
24d20 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a    ** one, fail..
24d30 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d    */.  if( !winM
24d40 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e  akeEndInDirSep(n
24d50 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a  Dir+1, zBuf) ){.
24d60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24d70 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
24d80 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
24d90 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
24da0 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
24db0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
24dc0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
24dd0 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
24de0 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e4", 0);.  }..  
24df0 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68  /*.  ** Check th
24e00 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
24e10 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
24e20 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
24e30 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a  porary file.  **
24e40 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c   name in the fol
24e50 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20  lowing format:. 
24e60 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d   **.  **   "<tem
24e70 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
24e80 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58  >/etilqs_XXXXXXX
24e90 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20  XXXXXXXX\0\0".  
24ea0 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  **.  ** If not, 
24eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24ec0 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ROR.  The number
24ed0 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65   17 is used here
24ee0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
24ef0 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  * account for th
24f00 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
24f10 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72  the 15 character
24f20 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61   random suffix a
24f30 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  nd the.  ** two 
24f40 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61  trailing NUL cha
24f50 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69  racters.  The fi
24f60 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65  nal directory se
24f70 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
24f80 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61  r.  ** has alrea
24f90 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77  dy added if it w
24fa0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  as not already p
24fb0 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  resent..  */.  n
24fc0 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
24fd0 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69  len30(zBuf);.  i
24fe0 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20  f( (nLen + nPre 
24ff0 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a  + 17) > nBuf ){.
25000 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25010 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
25020 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
25030 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
25040 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
25050 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
25060 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
25070 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
25080 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e5", 0);.  }..  
25090 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
250a0 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a  (nBuf-16-nLen, z
250b0 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45  Buf+nLen, SQLITE
250c0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
250d0 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74  X);..  j = sqlit
250e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
250f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
25100 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
25110 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [j]);.  for(i=0;
25120 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29   i<15; i++, j++)
25130 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  {.    zBuf[j] = 
25140 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
25150 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
25160 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
25170 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d  Chars)-1) ];.  }
25180 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a  .  zBuf[j] = 0;.
25190 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b    zBuf[j+1] = 0;
251a0 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66  .  *pzBuf = zBuf
251b0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
251c0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d  EMP-FILENAME nam
251d0 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
251e0 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  OK\n", zBuf));. 
251f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25200 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
25210 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
25220 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61  amed file is rea
25230 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e  lly a directory.
25240 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
25250 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  f.** it is somet
25260 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
25270 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20  a directory, or 
25280 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
25290 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  kind of memory.*
252a0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
252b0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
252c0 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e  int winIsDir(con
252d0 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  st void *zConver
252e0 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  ted){.  DWORD at
252f0 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
25300 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
25310 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73  rno;..  if( osIs
25320 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
25330 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
25340 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
25350 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
25360 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
25370 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
25380 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
25390 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
253a0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
253b0 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
253c0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
253f0 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
25400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
25420 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
25430 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
25440 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
25450 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29  {}.    if( !rc )
25460 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
25470 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d  ; /* Invalid nam
25480 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  e? */.    }.    
25490 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
254a0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
254b0 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  s;.#if SQLITE_OS
254c0 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
254d0 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
254e0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
254f0 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
25500 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
25510 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72  }.  return (attr
25520 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
25530 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61  TTRIBUTES) && (a
25540 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
25550 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d  TE_DIRECTORY);.}
25560 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
25570 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
25580 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
25590 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
255a0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
255b0 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70  to get maximum p
255c0 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20  ath name length 
255d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
255e0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
255f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
25600 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
25610 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
25620 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
25630 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
25640 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
25650 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25670 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
25680 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
25690 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
256a0 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
256b0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
256c0 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
256d0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
256e0 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
256f0 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
25700 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
25710 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
25720 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
25730 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
25740 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
25750 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25760 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
25770 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
25780 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
25790 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
257a0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
257c0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
257d0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
257e0 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
257f0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
25800 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
25810 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
25820 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  int cnt = 0;..  
25830 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
25840 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
25850 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
25860 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
25870 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
25880 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
25890 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
258a0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
258b0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
258c0 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d  .  char *zTmpnam
258d0 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65  e = 0; /* For te
258e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
258f0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  , if necessary. 
25900 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
25910 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
25920 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
25930 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
25940 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
25950 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
25960 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
25970 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
25980 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
25990 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
259a0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
259b0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
259c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
259d0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
259e0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
259f0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
25a00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
25a10 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
25a20 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
25a30 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25a40 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
25a50 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
25a60 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
25a70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
25a80 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
25a90 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
25aa0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
25ab0 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
25ac0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
25ad0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
25ae0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
25af0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
25b00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
25b10 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c  _JOURNAL.     ||
25b20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25b30 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
25b40 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
25b50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
25b60 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
25b70 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
25b80 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
25b90 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
25ba0 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
25bb0 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
25bc0 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
25bd0 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
25be0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
25bf0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
25c00 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20  are true:.  **. 
25c10 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
25c20 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
25c30 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
25c40 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
25c50 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
25c60 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
25c70 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
25c80 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
25c90 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
25ca0 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
25cb0 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
25cc0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
25cd0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
25ce0 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
25cf0 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
25d00 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
25d10 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
25d20 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
25d30 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
25d40 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
25d50 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
25d60 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
25d70 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
25d80 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
25d90 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
25da0 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
25db0 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
25dc0 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
25dd0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
25de0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
25df0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
25e00 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
25e10 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
25e20 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  ver.  ** automat
25e30 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
25e40 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
25e50 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
25e60 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
25e70 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
25e80 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
25e90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25ea0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
25eb0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
25ec0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
25ed0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25ee0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
25ef0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
25f00 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
25f10 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
25f20 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
25f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
25f40 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
25f50 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
25f60 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
25f70 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
25f80 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
25f90 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
25fa0 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
25fb0 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
25fc0 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
25fd0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
25fe0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
25ff0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
26000 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  B.       || eTyp
26010 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
26020 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
26030 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
26040 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20  N_TEMP_JOURNAL. 
26050 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
26060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
26070 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
26080 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
26090 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20  ASTER_JOURNAL.  
260a0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
260b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
260c0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
260d0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
260e0 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
260f0 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
26100 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
26110 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
26120 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  );.  pFile->h = 
26130 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
26140 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ALUE;..#if SQLIT
26150 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
26160 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21   !zUtf8Name && !
26170 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
26180 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  ectory ){.    sq
26190 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
261a0 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20  _ERROR,.        
261b0 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  "sqlite3_temp_di
261c0 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65  rectory variable
261d0 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66   should be set f
261e0 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a  or WinRT");.  }.
261f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
26200 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26210 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
26220 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
26230 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74 65  nerate a.  ** te
26240 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
26250 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20  e to use.  */.  
26260 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29  if( !zUtf8Name )
26270 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  {.    assert( is
26280 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
26290 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
262a0 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
262b0 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e  ame(pVfs, &zTmpn
262c0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
262d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
262e0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
262f0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
26300 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  %s", zUtf8Name, 
26310 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
26320 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
26330 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
26340 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
26350 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
26360 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
26370 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
26380 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
26390 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
263a0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
263b0 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
263c0 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
263d0 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
263e0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
263f0 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
26400 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
26410 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
26420 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
26430 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
26440 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
26450 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69    zUtf8Name[sqli
26460 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66  te3Strlen30(zUtf
26470 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
26480 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
26490 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
264a0 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
264b0 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
264c0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
264d0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
264e0 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
264f0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
26500 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
26510 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
26520 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
26530 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
26540 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
26550 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
26560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26570 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
26580 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77  PT;.  }..  if( w
26590 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
265a0 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ed) ){.    sqlit
265b0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
265c0 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
265d0 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
265e0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
265f0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
26600 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
26610 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d  ISDIR", zUtf8Nam
26620 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
26630 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
26640 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ISDIR;.  }..  if
26650 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
26660 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
26670 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
26680 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52  EAD | GENERIC_WR
26690 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ITE;.  }else{.  
266a0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
266b0 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
266c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49  ;.  }..  /* SQLI
266d0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
266e0 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  E is used to mak
266f0 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65  e sure that a ne
26700 77 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63  w file is.  ** c
26710 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
26720 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
26730 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
26740 73 69 76 65 20 61 63 63 65 73 73 22 0a 20 20 2a  sive access".  *
26750 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
26760 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
26770 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
26780 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
26790 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
267a0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
267b0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
267c0 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
267d0 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
267e0 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
267f0 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
26800 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
26810 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
26820 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
26830 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
26840 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
26850 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
26860 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
26870 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
26880 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
26890 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
268a0 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
268b0 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
268c0 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
268d0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
268e0 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
268f0 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
26900 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
26910 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
26920 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
26930 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
26940 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
26950 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
26960 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
26970 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
26980 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
26990 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
269a0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
269b0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
269c0 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
269d0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
26a00 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
26a30 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
26a40 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
26a50 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
26a60 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
26a70 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
26a80 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
26a90 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
26aa0 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
26ab0 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
26ac0 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
26ad0 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
26ae0 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
26af0 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
26b00 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
26b10 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
26b20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
26b30 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
26b40 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
26b50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
26b60 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
26b70 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
26b80 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f      CREATEFILE2_
26b90 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
26ba0 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72 61  ERS extendedPara
26bb0 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65  meters;.    exte
26bc0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
26bd0 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43  wSize = sizeof(C
26be0 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
26bf0 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b  DED_PARAMETERS);
26c00 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
26c10 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74  ameters.dwFileAt
26c20 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20  tributes =.     
26c30 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
26c40 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49  dAttributes & FI
26c50 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
26c60 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
26c70 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65  arameters.dwFile
26c80 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41  Flags = dwFlagsA
26c90 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
26ca0 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20  ILE_FLAG_MASK;. 
26cb0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
26cc0 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74 79  eters.dwSecurity
26cd0 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52  QosFlags = SECUR
26ce0 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20  ITY_ANONYMOUS;. 
26cf0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
26d00 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79  eters.lpSecurity
26d10 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c  Attributes = NUL
26d20 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  L;.    extendedP
26d30 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c  arameters.hTempl
26d40 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  ateFile = NULL;.
26d50 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
26d60 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c  osCreateFile2((L
26d70 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
26d80 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
26db0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dd0 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20  dwShareMode,.   
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
26e00 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
26e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74  &extendedParamet
26e40 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ers))==INVALID_H
26e50 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
26e80 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
26e90 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26eb0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
26ec0 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
26ed0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
26ee0 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
26ef0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
26f20 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f40 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
26f50 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f70 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
26f80 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
26fb0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
26fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fe0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
26ff0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
27020 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
27030 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
27040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27050 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
27060 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
27070 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
27080 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
27090 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
270a0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28   osCreateFileA((
270b0 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  LPCSTR)zConverte
270c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
270f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
27120 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
27150 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
27160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27170 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
27180 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271a0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
271b0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
271c0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271e0 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
271f0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
27200 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
27210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
27220 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  p */.    }.  }.#
27230 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f  endif.  winLogIo
27240 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
27250 5f 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  _);..  OSTRACE((
27260 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
27270 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
27280 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c  lx, rc=%s\n", h,
27290 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20   zUtf8Name,.    
272a0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
272b0 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41  Access, (h==INVA
272c0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
272d0 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
272e0 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d  ok"));..  if( h=
272f0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
27300 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69  VALUE ){.    pFi
27310 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
27320 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
27330 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
27340 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c  E_CANTOPEN, pFil
27350 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
27360 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61  inOpen", zUtf8Na
27370 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
27380 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
27390 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
273a0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
273b0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
273c0 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
273d0 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
273e0 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
273f0 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20   zName, id,.    
27400 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
27410 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
27420 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20  Y) &.           
27430 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49            ~(SQLI
27440 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
27450 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
27460 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20  RITE)),.        
27470 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
27480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
27490 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
274a0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
274b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74  .  }..  if( pOut
274c0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28  Flags ){.    if(
274d0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
274e0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
274f0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
27500 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
27510 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
27520 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
27530 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
27540 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41    }.  }..  OSTRA
27550 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
27560 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
27570 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67  ss=%lx, pOutFlag
27580 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73  s=%p, *pOutFlags
27590 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
275a0 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20    "rc=%s\n", h, 
275b0 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73  zUtf8Name, dwDes
275c0 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74  iredAccess, pOut
275d0 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  Flags, pOutFlags
275e0 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70   ?.           *p
275f0 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68  OutFlags : 0, (h
27600 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
27610 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
27620 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69  d" : "ok"));..#i
27630 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
27640 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  E.  if( isReadWr
27650 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51  ite && eType==SQ
27660 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
27670 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63 20  B.       && (rc 
27680 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  = winceCreateLoc
27690 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29  k(zName, pFile))
276a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b  !=SQLITE_OK.  ){
276b0 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
276c0 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  le(h);.    sqlit
276d0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
276e0 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
276f0 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
27700 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
27710 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65  PEN-CE-LOCK name
27720 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a  =%s, rc=%s\n", z
27730 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Name, sqlite3Err
27740 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
27750 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
27760 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
27770 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74     pFile->zDelet
27780 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76  eOnClose = zConv
27790 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23  erted;.  }else.#
277a0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
277b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
277c0 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73  erted);.  }..  s
277d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
277e0 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  name);.  pFile->
277f0 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f  pMethod = &winIo
27800 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d  Method;.  pFile-
27810 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
27820 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20  pFile->h = h;.  
27830 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
27840 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
27850 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
27860 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  E_RDONLY;.  }.  
27870 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
27880 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22  boolean(zName, "
27890 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
278a0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
278b0 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
278c0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
278d0 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  NFILE_PSOW;.  }.
278e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
278f0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
27900 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
27910 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54  zName;.#if SQLIT
27920 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27930 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20  0.  pFile->hMap 
27940 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d  = NULL;.  pFile-
27950 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
27960 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
27970 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  ze = 0;.  pFile-
27980 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
27990 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
279a0 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69  apSizeMax = sqli
279b0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
279c0 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a  szMmap;.#endif..
279d0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
279e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
279f0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
27a00 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a  the named file..
27a10 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
27a20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74  Windows does not
27a30 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f   allow a file to
27a40 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73   be deleted if s
27a50 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
27a60 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e  cess has it open
27a70 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76  .  Sometimes a v
27a80 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20  irus scanner or 
27a90 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d  indexing program
27aa0 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20  .** will open a 
27ab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f  journal file sho
27ac0 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73  rtly after it is
27ad0 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65   created in orde
27ae0 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65  r to do.** whate
27af0 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68  ver it does.  Wh
27b00 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70  ile this other p
27b10 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
27b20 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70  g the.** file op
27b30 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75  en, we will be u
27b40 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  nable to delete 
27b50 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  it.  To work aro
27b60 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62  und this.** prob
27b70 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30  lem, we delay 10
27b80 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
27b90 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65  nd try to delete
27ba0 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74   again.  Up.** t
27bb0 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  o MX_DELETION_AT
27bc0 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20  TEMPTs deletion 
27bd0 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e  attempts are run
27be0 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a   before giving.*
27bf0 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  * up and returni
27c00 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
27c10 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
27c20 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
27c30 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
27c40 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
27c50 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
27c60 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
27c70 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ame,      /* Nam
27c80 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
27c90 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ete */.  int syn
27ca0 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20  cDir            
27cb0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
27cc0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a   on win32 */.){.
27cd0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
27ce0 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44   int rc;.  DWORD
27cf0 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c   attr;.  DWORD l
27d00 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
27d10 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
27d20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27d30 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
27d40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73  USED_PARAMETER(s
27d50 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75  yncDir);..  Simu
27d60 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
27d70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27d80 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41  DELETE);.  OSTRA
27d90 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
27da0 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c  =%s, syncDir=%d\
27db0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73  n", zFilename, s
27dc0 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f  yncDir));..  zCo
27dd0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
27de0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
27df0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
27e00 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
27e10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
27e20 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
27e30 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
27e40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
27e50 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
27e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
27e70 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
27e80 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
27e90 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  T() ){.    do {.
27ea0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
27eb0 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f  NRT.      WIN32_
27ec0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
27ed0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
27ee0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74       memset(&sAt
27ef0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
27f00 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
27f10 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46       if ( osGetF
27f20 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
27f30 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74  (zConverted, Get
27f40 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
27f50 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
27f80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  ) ){.        att
27f90 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
27fa0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
27fb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27fc0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
27fd0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
27fe0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
27ff0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
28000 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
28010 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
28020 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
28030 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
28040 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28050 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
28060 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
28070 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
28080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28090 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
280a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
280b0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
280c0 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
280d0 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
280e0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
280f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  (zConverted);.#e
28100 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 20  ndif.      if ( 
28110 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
28120 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
28130 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
28140 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
28150 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
28160 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
28170 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
28180 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
28190 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
281a0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
281b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
281c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
281d0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
281e0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
281f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28200 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
28210 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
28220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
28230 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
28240 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
28250 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
28260 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
28270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
28280 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
28290 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
282a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
282b0 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
282c0 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
282d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
282e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
282f0 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
28300 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28310 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
28320 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
28330 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
28340 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
28350 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
28360 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
28370 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
28380 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
28390 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
283a0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
283b0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
283c0 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a   else{.    do {.
283d0 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
283e0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
283f0 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  A(zConverted);. 
28400 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
28410 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
28420 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
28430 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
28440 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
28450 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
28460 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
28470 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
28480 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
28490 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
284a0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
284b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
284c0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
284d0 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
284e0 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
284f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28500 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
28510 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
28520 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
28540 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
28550 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
28560 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28570 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
28580 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
28590 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
285a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
285b0 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28  ( osDeleteFileA(
285c0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
285d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
285e0 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
285f0 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
28600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28610 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
28620 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
28630 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
28640 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28650 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
28660 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
28670 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
28680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
28690 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  ile(1);.  }.#end
286a0 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  if.  if( rc && r
286b0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
286c0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a  DELETE_NOENT ){.
286d0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
286e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
286f0 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
28700 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65 22  rno, "winDelete"
28710 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
28720 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f  }else{.    winLo
28730 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49  gIoerr(cnt, __LI
28740 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  NE__);.  }.  sql
28750 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28760 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
28770 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
28780 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69  s, rc=%s\n", zFi
28790 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  lename, sqlite3E
287a0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
287b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
287c0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
287d0 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74  istence and stat
287e0 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
287f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
28800 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
28810 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28820 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
28830 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
28840 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
28850 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
28860 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
28870 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
28880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28890 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
288a0 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
288b0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
288c0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
288d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
288e0 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
288f0 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
28900 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
28910 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
28920 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
28930 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
28940 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
28950 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
28960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28970 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
28980 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
28990 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67  SS name=%s, flag
289a0 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70  s=%x, pResOut=%p
289b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
289c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73  zFilename, flags
289d0 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20  , pResOut));..  
289e0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
289f0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
28a00 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
28a10 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
28a20 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
28a30 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
28a40 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
28a50 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
28a60 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  ", zFilename));.
28a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28a80 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
28a90 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  PT;.  }.  if( os
28aa0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  IsNT() ){.    in
28ab0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
28ac0 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
28ad0 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
28ae0 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
28af0 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
28b00 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
28b10 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
28b20 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
28b30 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
28b40 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
28b70 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
28b80 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
28bb0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
28bc0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
28bd0 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
28be0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
28bf0 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
28c00 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
28c10 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
28c20 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
28c30 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
28c40 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
28c50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
28c60 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
28c70 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
28c80 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
28c90 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
28ca0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
28cb0 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
28cc0 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20  SizeLow==0 ){.  
28cd0 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
28ce0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
28cf0 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTES;.      }els
28d00 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
28d10 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
28d20 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
28d30 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
28d40 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  .      winLogIoe
28d50 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f  rr(cnt, __LINE__
28d60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
28d70 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
28d80 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
28d90 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
28da0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
28db0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28dc0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28dd0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
28de0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28df0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
28e00 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
28e10 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20  "winAccess",.   
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e30 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
28e40 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
28e50 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
28e60 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
28e70 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
28e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
28e90 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
28ea0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
28eb0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
28ec0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
28ed0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
28ee0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
28ef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28f00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
28f10 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
28f20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
28f30 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
28f40 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
28f50 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
28f60 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
28f70 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
28f80 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
28f90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
28fa0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
28fb0 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
28fc0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
28fd0 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
28ff0 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
29000 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
29010 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29020 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
29030 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
29040 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
29050 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
29060 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
29070 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
29080 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%s, pResOut=%p,
29090 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
290a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
290b0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
290c0 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ame, pResOut, *p
290d0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
290e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
290f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
29100 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
29110 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
29120 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
29130 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a   drive letter.**
29140 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
29150 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a  olon character..
29160 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
29170 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
29180 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74  ndColon(.  const
29190 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
291a0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73  .){.  return ( s
291b0 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
291c0 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
291d0 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
291e0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
291f0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
29200 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
29210 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
29220 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d  be used verbatim
29230 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  .  If.** non-zer
29240 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72  o is returned fr
29250 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
29260 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
29270 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70  nction must simp
29280 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72  ly.** use the pr
29290 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65  ovided path name
292a0 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72   verbatim -OR- r
292b0 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61  esolve it into a
292c0 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a   full path name.
292d0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74  ** using the Get
292e0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e  FullPathName Win
292f0 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  32 API function 
29300 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
29310 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
29320 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
29330 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
29340 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
29350 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
29360 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
29370 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72  ts with a forwar
29380 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63  d slash or a bac
29390 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69  kslash, it is ei
293a0 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61  ther.  ** a lega
293b0 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f  l UNC name, a vo
293c0 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61  lume relative pa
293d0 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  th, or an absolu
293e0 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20  te path name in 
293f0 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20  the.  ** "Unix" 
29400 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77  format on Window
29410 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  s.  There is no 
29420 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66  easy way to diff
29430 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
29440 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  n.  ** the final
29450 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72   two cases; ther
29460 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e  efore, we return
29470 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72   the safer retur
29480 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a  n value of TRUE.
29490 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c    ** so that cal
294a0 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
294b0 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c  ction will simpl
294c0 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  y use it verbati
294d0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  m..  */.  if ( w
294e0 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68  inIsDirSep(zPath
294f0 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
29500 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
29510 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
29520 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
29530 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65  rts with a lette
29540 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74  r and a colon it
29550 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c   is either a vol
29560 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ume.  ** relativ
29570 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73  e path or an abs
29580 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c  olute path.  Cal
29590 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
295a0 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20  ction must not. 
295b0 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74   ** attempt to t
295c0 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c  reat it as a rel
295d0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
295e0 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c  (i.e. they shoul
295f0 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a  d simply use.  *
29600 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a  * it verbatim)..
29610 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
29620 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
29630 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20  olon(zPathname) 
29640 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
29650 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
29660 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
29670 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
29680 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
29690 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
296a0 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
296b0 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
296c0 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
296d0 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
296e0 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
296f0 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
29700 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
29710 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
29720 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
29730 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
29740 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
29750 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
29760 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
29770 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
29780 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
29790 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
297a0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
297b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
297c0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
297d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
297e0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
297f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
29800 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
29810 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
29820 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
29830 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
29840 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
29850 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29870 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
29880 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
29890 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
298c0 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64  fer */.){..#if d
298d0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
298e0 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
298f0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
29900 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
29910 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29920 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74  nFull);.  assert
29930 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d  ( nFull>=pVfs->m
29940 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69  xPathname );.  i
29950 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
29960 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
29970 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
29980 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
29990 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
299a0 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
299b0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
299c0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
299d0 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
299e0 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
299f0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
29a00 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
29a10 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
29a20 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
29a30 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
29a40 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
29a50 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
29a60 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
29a70 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
29a80 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
29a90 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73  ctory and a slas
29aa0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  h..    */.    ch
29ab0 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
29ac0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
29ad0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
29ae0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
29af0 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
29b00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29b10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
29b20 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
29b30 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
29b40 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
29b50 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
29b60 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
29b70 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20  X_TO_WIN_A) |.  
29b80 20 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45            CCP_RE
29b90 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76  LATIVE, zRelativ
29ba0 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
29bb0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
29bc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29bd0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
29be0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
29bf0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
29c00 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
29c10 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
29c40 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74  thname1", zRelat
29c50 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
29c60 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
29c70 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
29c80 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
29c90 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
29ca0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
29cb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
29cc0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
29cd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
29ce0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
29cf0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
29d00 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
29d10 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
29d20 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
29d30 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
29d60 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
29d70 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38 29  DirSep(), zUtf8)
29d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29d90 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
29da0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29db0 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zOut);.    }.  }
29dc0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
29dd0 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  zOut = sqlite3Ma
29de0 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e  llocZero( pVfs->
29df0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a  mxPathname+1 );.
29e00 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b      if( !zOut ){
29e10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
29e20 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
29e30 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
29e40 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
29e50 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
29e60 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43     (osIsNT() ? C
29e70 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
29e80 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
29e90 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20  _WIN_A),.       
29ea0 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20       zRelative, 
29eb0 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61  zOut, pVfs->mxPa
29ec0 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20  thname+1)<0 ){. 
29ed0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29ee0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72  e(zOut);.      r
29ef0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
29f00 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
29f10 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  N_CONVPATH, (DWO
29f20 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
29f50 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame2", zRelative
29f60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29f70 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
29f80 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
29f90 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29  f8Filename(zOut)
29fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74  ;.      if( !zUt
29fb0 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  f8 ){.        sq
29fc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
29fd0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29fe0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
29ff0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2a000 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
2a010 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
2a020 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
2a030 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
2a040 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
2a050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a060 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
2a070 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2a080 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2a0a0 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
2a0b0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
2a0c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20  QLITE_OS_WINRT) 
2a0d0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
2a0e0 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
2a0f0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2a100 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
2a110 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
2a120 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
2a130 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
2a140 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
2a150 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e  old. */.  /* Win
2a160 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f  RT has no way to
2a170 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74   convert a relat
2a180 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61  ive path to an a
2a190 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a  bsolute one. */.
2a1a0 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
2a1b0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
2a1c0 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
2a1d0 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
2a1e0 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
2a1f0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
2a200 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2a210 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2a220 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
2a230 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
2a240 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
2a250 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
2a260 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
2a270 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
2a280 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
2a290 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
2a2a0 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
2a2b0 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
2a2c0 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
2a2d0 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
2a2e0 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
2a2f0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
2a300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2a310 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2a320 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2a330 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
2a340 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2a350 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a360 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
2a370 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
2a380 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2a390 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
2a3a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
2a3b0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
2a3c0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
2a3d0 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
2a3e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a3f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
2a400 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
2a410 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
2a420 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
2a430 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
2a440 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
2a450 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
2a460 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
2a470 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
2a480 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67  is path name beg
2a490 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20  ins with "/X:", 
2a4a0 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79  where "X" is any
2a4b0 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a   alphabetic.  **
2a4c0 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63   character, disc
2a4d0 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ard the initial 
2a4e0 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74  "/" from the pat
2a4f0 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hname..  */.  if
2a500 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
2a510 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76  '/' && winIsDriv
2a520 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
2a530 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a  zRelative+1) ){.
2a540 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
2a550 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
2a560 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2a570 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2a580 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2a590 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2a5a0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2a5b0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2a5c0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2a5d0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2a5e0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2a5f0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
2a600 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
2a610 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
2a620 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
2a630 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
2a640 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
2a650 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
2a660 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2a670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2a680 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
2a690 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
2a6a0 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
2a6b0 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
2a6c0 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
2a6d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
2a6e0 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
2a6f0 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
2a700 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
2a710 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
2a720 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
2a730 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
2a740 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
2a750 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
2a760 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
2a770 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
2a780 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
2a790 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
2a7a0 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
2a7b0 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
2a7c0 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
2a7d0 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
2a7e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
2a7f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2a800 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2a810 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2a820 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
2a850 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
2a860 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
2a870 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
2a880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2a890 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
2a8a0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
2a8b0 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
2a8c0 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
2a8d0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
2a8e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2a8f0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2a900 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
2a910 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54  T() ){.    LPWST
2a920 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79  R zTemp;.    nBy
2a930 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2a940 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
2a950 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
2a960 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
2a970 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
2a980 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2a990 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2a9a0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
2a9b0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2a9c0 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73  PEN_FULLPATH, os
2a9d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9f0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
2aa00 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65  lPathname1", zRe
2aa10 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20  lative);.    }. 
2aa20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
2aa30 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
2aa40 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
2aa50 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
2aa60 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
2aa70 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
2aa80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2aa90 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2aaa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aab0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2aac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
2aad0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
2aae0 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
2aaf0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
2ab00 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
2ab10 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
2ab20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ab30 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2ab40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2ab50 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
2ab60 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2ab70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2ab80 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
2ab90 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2aba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2abb0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2abc0 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
2abd0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2abe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2abf0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2ac00 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
2ac10 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
2ac20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2ac30 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
2ac40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2ac50 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
2ac60 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
2ac70 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
2ac80 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2ac90 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
2aca0 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
2acb0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
2acc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2acd0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2ace0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
2acf0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2ad00 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
2ad10 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
2ad20 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad40 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
2ad50 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76  name3", zRelativ
2ad60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
2ad70 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
2ad80 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
2ad90 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
2ada0 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
2adb0 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
2adc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2add0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2ade0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
2adf0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2ae00 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2ae10 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
2ae20 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
2ae30 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
2ae40 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
2ae50 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
2ae60 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
2ae70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2ae80 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2ae90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
2aea0 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
2aeb0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2aec0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
2aed0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
2aee0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
2af10 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76  name4", zRelativ
2af20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2af30 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2af40 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
2af50 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38   = winMbcsToUtf8
2af60 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c  (zTemp, osAreFil
2af70 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
2af80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2af90 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
2afa0 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
2afb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2afc0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2afd0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2afe0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
2aff0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2b000 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2b010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b020 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2b030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b040 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2b050 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
2b060 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b070 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2b080 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
2b090 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
2b0a0 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
2b0b0 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
2b0c0 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
2b0d0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2b0e0 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
2b0f0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2b100 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2b110 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
2b120 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2b130 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2b140 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
2b150 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65  LE h;.#if define
2b160 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2b170 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73  int nFull = pVfs
2b180 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2b190 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
2b1a0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2b1b0 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f  o( nFull );.  vo
2b1c0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
2b1d0 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d   0;.  if( zFull=
2b1e0 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2b1f0 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
2b200 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
2b210 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
2b220 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
2b230 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2b240 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2b250 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2b260 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21  , nFull, zFull)!
2b270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b290 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41  Full);.    OSTRA
2b2a0 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2b2b0 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2b2c0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2b2d0 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2b2e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43  turn 0;.  }.  zC
2b2f0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
2b300 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
2b310 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  ename(zFull);.  
2b320 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
2b330 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69  ll);.#else.  voi
2b340 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
2b350 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2b360 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
2b370 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
2b380 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2b390 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43  .#endif.  if( zC
2b3a0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
2b3b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2b3c0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2b3d0 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2b3e0 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2b3f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2b400 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
2b410 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
2b420 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
2b430 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
2b440 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
2b450 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
2b460 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
2b470 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
2b480 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
2b490 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
2b4a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
2b4b0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
2b4c0 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
2b4d0 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
2b4e0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
2b4f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
2b500 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2b510 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2b520 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2b530 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c  void*)h));.  sql
2b540 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2b550 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
2b560 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
2b570 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
2b580 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2b590 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2b5a0 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
2b5b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b5c0 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47  ER(pVfs);.  winG
2b5d0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
2b5e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2b5f0 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
2b600 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
2b610 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
2b620 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
2b630 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
2b640 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2b650 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20   FARPROC proc;. 
2b660 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b670 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20  R(pVfs);.  proc 
2b680 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  = osGetProcAddre
2b690 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20  ssA((HANDLE)pH, 
2b6a0 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45  zSym);.  OSTRACE
2b6b0 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d  (("DLSYM handle=
2b6c0 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61  %p, symbol=%s, a
2b6d0 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20  ddress=%p\n",.  
2b6e0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
2b6f0 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a  pH, zSym, (void*
2b700 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72  )proc));.  retur
2b710 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
2b720 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20  )proc;.}.static 
2b730 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
2b740 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2b750 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
2b760 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b770 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
2b780 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
2b790 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20  NDLE)pHandle);. 
2b7a0 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f   OSTRACE(("DLCLO
2b7b0 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  SE handle=%p\n",
2b7c0 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29   (void*)pHandle)
2b7d0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2b7e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2b7f0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2b800 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2b810 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
2b820 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2b830 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2b840 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
2b850 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
2b860 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2b870 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
2b880 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 61 6e 64  ion for the rand
2b890 6f 6d 6e 65 73 73 20 67 61 74 68 65 72 65 72 2e  omness gatherer.
2b8a0 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2b8b0 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  ct EntropyGather
2b8c0 65 72 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  er EntropyGather
2b8d0 65 72 3b 0a 73 74 72 75 63 74 20 45 6e 74 72 6f  er;.struct Entro
2b8e0 70 79 47 61 74 68 65 72 65 72 20 7b 0a 20 20 75  pyGatherer {.  u
2b8f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b  nsigned char *a;
2b900 20 20 20 2f 2a 20 47 61 74 68 65 72 20 65 6e 74     /* Gather ent
2b910 72 6f 70 79 20 69 6e 74 6f 20 74 68 69 73 20 62  ropy into this b
2b920 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
2b930 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2b940 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20 69 6e  * Size of a[] in
2b950 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
2b960 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2b970 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69 6e 70 75  /* XOR next inpu
2b980 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20  t into a[i] */. 
2b990 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20 20 20 20   int nXor;      
2b9a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b9b0 66 20 58 4f 52 20 6f 70 65 72 61 74 69 6f 6e 73  f XOR operations
2b9c0 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66   done */.};..#if
2b9d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2b9e0 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
2b9f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2ba00 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69  ANDOMNESS)./* Mi
2ba10 78 20 73 7a 20 62 79 74 65 73 20 6f 66 20 65 6e  x sz bytes of en
2ba20 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e 20 2a 2f  tropy into p. */
2ba30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 6f 72  .static void xor
2ba40 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70 79 47 61  Memory(EntropyGa
2ba50 74 68 65 72 65 72 20 2a 70 2c 20 75 6e 73 69 67  therer *p, unsig
2ba60 6e 65 64 20 63 68 61 72 20 2a 78 2c 20 69 6e 74  ned char *x, int
2ba70 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b   sz){.  int j, k
2ba80 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70  ;.  for(j=0, k=p
2ba90 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b  ->i; j<sz; j++){
2baa0 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e  .    p->a[k++] ^
2bab0 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  = x[j];.    if( 
2bac0 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20 3d 20 30  k>=p->na ) k = 0
2bad0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b  ;.  }.  p->i = k
2bae0 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73  ;.  p->nXor += s
2baf0 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  z;.}.#endif /* !
2bb00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2bb10 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
2bb20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
2bb30 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a 2f 2a 0a  DOMNESS) */../*.
2bb40 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
2bb50 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
2bb60 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
2bb70 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
2bb80 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
2bb90 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2bba0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2bbb0 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20 64 65 66   *zBuf){.#if def
2bbc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2bbd0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2bbe0 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
2bbf0 45 53 53 29 0a 20 20 55 4e 55 53 45 44 5f 50 41  ESS).  UNUSED_PA
2bc00 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2bc10 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2bc20 20 6e 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   nBuf);.  return
2bc30 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a 20 20 45   nBuf;.#else.  E
2bc40 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 65  ntropyGatherer e
2bc50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2bc60 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65  ETER(pVfs);.  me
2bc70 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
2bc80 75 66 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  uf);.#if defined
2bc90 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
2bca0 53 43 5f 56 45 52 3e 3d 31 34 30 30 20 26 26 20  SC_VER>=1400 && 
2bcb0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2bcc0 0a 20 20 72 61 6e 64 5f 73 28 28 75 6e 73 69 67  .  rand_s((unsig
2bcd0 6e 65 64 20 69 6e 74 2a 29 7a 42 75 66 29 3b 20  ned int*)zBuf); 
2bce0 2f 2a 20 72 61 6e 64 5f 73 28 29 20 69 73 20 6e  /* rand_s() is n
2bcf0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  ot available wit
2bd00 68 20 4d 69 6e 47 57 20 2a 2f 0a 23 65 6e 64 69  h MinGW */.#endi
2bd10 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53  f /* defined(_MS
2bd20 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
2bd30 45 52 3e 3d 31 34 30 30 20 2a 2f 0a 20 20 65 2e  ER>=1400 */.  e.
2bd40 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
2bd50 61 72 2a 29 7a 42 75 66 3b 0a 20 20 65 2e 6e 61  ar*)zBuf;.  e.na
2bd60 20 3d 20 6e 42 75 66 3b 0a 20 20 65 2e 6e 58 6f   = nBuf;.  e.nXo
2bd70 72 20 3d 20 30 3b 0a 20 20 65 2e 69 20 3d 20 30  r = 0;.  e.i = 0
2bd80 3b 0a 20 20 7b 0a 20 20 20 20 53 59 53 54 45 4d  ;.  {.    SYSTEM
2bd90 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
2bda0 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
2bdb0 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2bdc0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2bdd0 72 2a 29 26 78 2c 20 73 69 7a 65 6f 66 28 53 59  r*)&x, sizeof(SY
2bde0 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20 20 7d 0a  STEMTIME));.  }.
2bdf0 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69    {.    DWORD pi
2be00 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
2be10 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
2be20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2be30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2be40 70 69 64 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52  pid, sizeof(DWOR
2be50 44 29 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  D));.  }.#if SQL
2be60 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
2be70 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63  .    ULONGLONG c
2be80 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
2be90 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 78 6f 72  unt64();.    xor
2bea0 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2beb0 67 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74 2c  gned char*)&cnt,
2bec0 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e   sizeof(ULONGLON
2bed0 47 29 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  G));.  }.#else. 
2bee0 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74   {.    DWORD cnt
2bef0 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
2bf00 74 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  t();.    xorMemo
2bf10 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2bf20 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a   char*)&cnt, siz
2bf30 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d  eof(DWORD));.  }
2bf40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2bf50 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 20 20  E_OS_WINRT */.  
2bf60 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
2bf70 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
2bf80 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
2bf90 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 78 6f  nter(&i);.    xo
2bfa0 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2bfb0 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 2c 20  igned char*)&i, 
2bfc0 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54  sizeof(LARGE_INT
2bfd0 45 47 45 52 29 29 3b 0a 20 20 7d 0a 23 69 66 20  EGER));.  }.#if 
2bfe0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2bff0 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
2c000 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
2c010 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20  IN32_USE_UUID.  
2c020 7b 0a 20 20 20 20 55 55 49 44 20 69 64 3b 0a 20  {.    UUID id;. 
2c030 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30     memset(&id, 0
2c040 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2c050 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74  .    osUuidCreat
2c060 65 28 26 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d  e(&id);.    xorM
2c070 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2c080 6e 65 64 20 63 68 61 72 2a 29 26 69 64 2c 20 73  ned char*)&id, s
2c090 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2c0a0 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c    memset(&id, 0,
2c0b0 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a   sizeof(UUID));.
2c0c0 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74 65      osUuidCreate
2c0d0 53 65 71 75 65 6e 74 69 61 6c 28 26 69 64 29 3b  Sequential(&id);
2c0e0 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2c0f0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2c100 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66 28 55  r*)&id, sizeof(U
2c110 55 49 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  UID));.  }.#endi
2c120 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f  f /* !SQLITE_OS_
2c130 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
2c140 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
2c150 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55  ITE_WIN32_USE_UU
2c160 49 44 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65  ID */.  return e
2c170 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75  .nXor>nBuf ? nBu
2c180 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64  f : e.nXor;.#end
2c190 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2c1a0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2c1b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2c1c0 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f  T_RANDOMNESS) */
2c1d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
2c1e0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
2c1f0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
2c200 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
2c210 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
2c220 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
2c230 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c240 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
2c250 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
2c260 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  sleep((microsec+
2c270 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
2c280 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2c290 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
2c2a0 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
2c2b0 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
2c2c0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2c2d0 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
2c2e0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
2c2f0 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
2c300 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
2c310 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
2c320 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
2c330 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
2c340 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2c350 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
2c360 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
2c370 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
2c380 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
2c390 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
2c3a0 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
2c3b0 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
2c3c0 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
2c3d0 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
2c3e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
2c3f0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2c400 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2c410 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2c420 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2c430 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
2c440 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2c450 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2c460 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
2c470 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
2c480 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
2c490 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
2c4a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2c4b0 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
2c4c0 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
2c4d0 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
2c4e0 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
2c4f0 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
2c500 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
2c510 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
2c520 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
2c530 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
2c540 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
2c550 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
2c560 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
2c570 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2c580 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  te.** cannot be 
2c590 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2c5a0 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2c5b0 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
2c5c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
2c5d0 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
2c5e0 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
2c5f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
2c600 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
2c610 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
2c620 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30 30  mber of.     100
2c630 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
2c640 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
2c650 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
2c660 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20 20  D 2305813.5)..  
2c670 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
2c680 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2c690 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
2c6a0 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
2c6b0 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
2c6c0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2c6d0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2c6e0 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
2c6f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2c700 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
2c710 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
2c720 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2c730 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
2c740 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
2c750 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
2c760 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
2c770 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2c780 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
2c790 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20 20  itValue =.      
2c7a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2c7b0 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
2c7c0 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
2c7d0 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73  00000 +.      (s
2c7e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
2c7f0 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
2c800 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
2c810 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
2c820 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
2c830 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
2c840 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
2c850 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
2c860 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
2c870 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73   */.  if (!osSys
2c880 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
2c890 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
2c8a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c8b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73  _ERROR;.  }.#els
2c8c0 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  e.  osGetSystemT
2c8d0 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
2c8e0 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
2c8f0 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
2c900 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
2c910 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
2c920 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
2c930 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
2c940 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20 20  32BitValue) +.  
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2c960 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
2c970 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73  wLowDateTime)/(s
2c980 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30  qlite3_int64)100
2c990 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  00;..#ifdef SQLI
2c9a0 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
2c9b0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2c9c0 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
2c9d0 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
2c9e0 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
2c9f0 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
2ca00 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
2ca10 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
2ca20 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2ca30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ca40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
2ca50 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2ca60 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2ca70 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2ca80 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
2ca90 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
2caa0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
2cab0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
2cac0 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
2cad0 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
2cae0 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
2caf0 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
2cb00 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2cb10 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2cb20 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
2cb30 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
2cb40 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20   *prNow){.  int 
2cb50 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rc;.  sqlite3_in
2cb60 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69  t64 i;.  rc = wi
2cb70 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2cb80 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69  4(pVfs, &i);.  i
2cb90 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70  f( !rc ){.    *p
2cba0 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
2cbb0 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  0.0;.  }.  retur
2cbc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2cbd0 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2cbe0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
2cbf0 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69  rks like a combi
2cc00 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74  nation of.** Get
2cc10 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20  LastError() and 
2cc20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20  FormatMessage() 
2cc30 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65  on Windows (or e
2cc40 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65  rrno and.** stre
2cc50 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78  rror_r() on Unix
2cc60 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f  ). After an erro
2cc70 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  r is returned by
2cc80 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69   an OS.** functi
2cc90 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  on, SQLite calls
2cca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2ccb0 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e  ith zBuf pointin
2ccc0 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72  g to.** a buffer
2ccd0 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20   of nBuf bytes. 
2cce0 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f  The OS layer sho
2ccf0 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  uld populate the
2cd00 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20  .** buffer with 
2cd10 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
2cd20 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65   UTF-8 encoded e
2cd30 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
2cd40 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c  describing the l
2cd50 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20  ast IO error to 
2cd60 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69  have occurred wi
2cd70 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  thin the calling
2cd80 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  .** thread..**.*
2cd90 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d  * If the error m
2cda0 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
2cdb0 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70  rge for the supp
2cdc0 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20  lied buffer,.** 
2cdd0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  it should be tru
2cde0 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75  ncated. The retu
2cdf0 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74  rn value of xGet
2ce00 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20  LastError.** is 
2ce10 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
2ce20 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
2ce30 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
2ce40 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
2ce50 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
2ce60 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
2ce70 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65  ated). If non-ze
2ce80 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  ro is returned,.
2ce90 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
2cea0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69  t necessary to i
2ceb0 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74  nclude the nul-t
2cec0 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
2ced0 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75  ter.** in the ou
2cee0 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  tput buffer..**.
2cef0 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67  ** Not supplying
2cf00 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2cf10 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61  e will have no a
2cf20 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a  dverse effect.**
2cf30 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69   on SQLite. It i
2cf40 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61  s fine to have a
2cf50 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2cf60 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72   that never.** r
2cf70 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
2cf80 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  message:.**.**  
2cf90 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72   int xGetLastErr
2cfa0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2cfb0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2cfc0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20  char *zBuf){.** 
2cfd0 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b      assert(zBuf[
2cfe0 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20  0]=='\0');.**   
2cff0 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20    return 0;.**  
2d000 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72   }.**.** However
2d010 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   if an error mes
2d020 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64  sage is supplied
2d030 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63  , it will be inc
2d040 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20  orporated.** by 
2d050 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20  sqlite into the 
2d060 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76  error message av
2d070 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2d080 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ser using.** sql
2d090 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70  ite3_errmsg(), p
2d0a0 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49  ossibly making I
2d0b0 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20  O errors easier 
2d0c0 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61  to debug..*/.sta
2d0d0 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
2d0e0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
2d0f0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
2d100 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2d110 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
2d120 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
2d130 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d140 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20  ER(pVfs);.  if( 
2d150 6e 42 75 66 3e 30 20 29 20 77 69 6e 47 65 74 4c  nBuf>0 ) winGetL
2d160 61 73 74 45 72 72 6f 72 4d 73 67 28 65 2c 20 6e  astErrorMsg(e, n
2d170 42 75 66 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65  Buf, zBuf);.  re
2d180 74 75 72 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn e;.}../*.**
2d190 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
2d1a0 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
2d1b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2d1c0 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
2d1d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
2d1e0 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
2d1f0 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
2d200 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
2d210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d220 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2d230 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2d240 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
2d250 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2d260 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
2d270 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2d280 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2d290 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2d2a0 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
2d2b0 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
2d2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
2d2d0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2f0 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2d300 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2d310 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2d320 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2d330 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2d340 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
2d350 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
2d360 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2d370 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2d380 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
2d390 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2d3a0 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2d3b0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2d3c0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2d3d0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
2d3e0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
2d3f0 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
2d400 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2d410 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2d420 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2d430 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2d440 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2d450 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2d460 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2d470 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2d480 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
2d490 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
2d4a0 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
2d4b0 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
2d4c0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
2d4d0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2d4e0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2d4f0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
2d500 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2d510 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2d520 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2d530 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
2d540 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
2d550 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2d560 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2d570 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2d580 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
2d590 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
2d5a0 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e  /.  };.#if defin
2d5b0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2d5c0 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74  HAS_WIDE).  stat
2d5d0 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77  ic sqlite3_vfs w
2d5e0 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20  inLongPathVfs = 
2d5f0 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2d600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
2d610 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
2d620 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
2d630 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2d640 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2d650 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
2d660 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2d670 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d690 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2d6a0 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20  n32-longpath",  
2d6b0 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2d6c0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2d6d0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2d6e0 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2d6f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2d700 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2d710 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2d720 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
2d730 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
2d740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2d750 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2d760 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2d770 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
2d780 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
2d790 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
2d7a0 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2d7b0 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2d7c0 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2d7d0 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2d7e0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
2d7f0 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2d800 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2d810 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2d820 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2d830 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2d840 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2d850 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2d860 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
2d870 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2d880 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20  ntTime,      /* 
2d890 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
2d8a0 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
2d8b0 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
2d8c0 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
2d8d0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2d8e0 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e  nt64, /* xCurren
2d8f0 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2d900 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2d910 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ll,    /* xSetSy
2d920 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2d930 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2d940 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74  ,    /* xGetSyst
2d950 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2d960 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2d970 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2d980 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65  mCall */.  };.#e
2d990 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c  ndif..  /* Doubl
2d9a0 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
2d9b0 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
2d9c0 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
2d9d0 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
2d9e0 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
2d9f0 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
2da00 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
2da10 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
2da20 79 73 63 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a 0a  yscall)==80 );..
2da30 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20    /* get memory 
2da40 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67  map allocation g
2da50 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20  ranularity */.  
2da60 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e  memset(&winSysIn
2da70 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59  fo, 0, sizeof(SY
2da80 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66  STEM_INFO));.#if
2da90 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2daa0 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79  .  osGetNativeSy
2dab0 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
2dac0 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f  Info);.#else.  o
2dad0 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26  sGetSystemInfo(&
2dae0 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e  winSysInfo);.#en
2daf0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77 69  dif.  assert( wi
2db00 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
2db10 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
2db20 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2db30 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
2db40 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71  eSize>0 );..  sq
2db50 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
2db60 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
2db70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2db80 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2db90 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  DE).  sqlite3_vf
2dba0 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c  s_register(&winL
2dbb0 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a  ongPathVfs, 0);.
2dbc0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
2dbd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
2dbe0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e  nt sqlite3_os_en
2dbf0 64 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c  d(void){.#if SQL
2dc00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
2dc10 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  f( sleepObj!=NUL
2dc20 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  L ){.    osClose
2dc30 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29  Handle(sleepObj)
2dc40 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d  ;.    sleepObj =
2dc50 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69   NULL;.  }.#endi
2dc60 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
2dc70 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2dc80 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
2dc90 20 2a 2f 0a                                       */.