/ Hex Artifact Content
Login

Artifact fd94dd9c5738a65f629827df2df458fef8e827031ec99f7e2410bf5811ef979f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0860: 4e 54 48 52 45 53 48 4f 4c 44 0a 23 20 20 64 65  NTHRESHOLD.#  de
0870: 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 54 48  fine NTDDI_WINTH
0880: 52 45 53 48 4f 4c 44 20 20 20 20 20 20 20 20 20  RESHOLD         
0890: 20 20 20 20 20 20 20 30 78 30 36 30 34 30 30 30         0x0604000
08a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
08b0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
08c0: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78  the GetVersionEx
08d0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61  [AW] functions a
08e0: 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f 6e  re deprecated on
08f0: 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 73   the.** target s
0900: 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73 69  ystem.  GetVersi
0910: 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20 64  onEx was first d
0920: 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69 6e  eprecated in Win
0930: 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  8.1..*/.#ifndef 
0940: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0950: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0960: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0970: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0980: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0990: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
09a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69   0   /* GetVersi
09d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63  onEx() is deprec
09e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a  ated */.#  else.
09f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0a00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
0a10: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47  IONEX   1   /* G
0a20: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73  etVersionEx() is
0a30: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65   current */.#  e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0a50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0a60: 69 66 20 74 68 65 20 43 72 65 61 74 65 46 69 6c  if the CreateFil
0a70: 65 4d 61 70 70 69 6e 67 41 20 66 75 6e 63 74 69  eMappingA functi
0a80: 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  on is supported 
0a90: 6f 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  on the.** target
0aa0: 20 73 79 73 74 65 6d 2e 20 20 49 74 20 69 73 20   system.  It is 
0ab0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  unavailable when
0ac0: 20 75 73 69 6e 67 20 22 6d 69 6e 63 6f 72 65 2e   using "mincore.
0ad0: 6c 69 62 22 20 6f 6e 20 57 69 6e 31 30 2e 0a 2a  lib" on Win10..*
0ae0: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0af0: 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 31 30 2c   for Windows 10,
0b00: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 22   always assume "
0b10: 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20 69 73 20  mincore.lib" is 
0b20: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  in use..*/.#ifnd
0b30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0b40: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0b50: 47 41 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  GA.#  if defined
0b60: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20  (NTDDI_VERSION) 
0b70: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  && NTDDI_VERSION
0b80: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 54 48 52   >= NTDDI_WINTHR
0b90: 45 53 48 4f 4c 44 0a 23 20 20 20 20 64 65 66 69  ESHOLD.#    defi
0ba0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0bb0: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0bc0: 47 41 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  GA   0.#  else.#
0bd0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0be0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
0bf0: 4c 45 4d 41 50 50 49 4e 47 41 20 20 20 31 0a 23  LEMAPPINGA   1.#
0c00: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0c20: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ant should alrea
0c30: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69  dy be defined (i
0c40: 6e 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22  n the "WinDef.h"
0c50: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23   SDK file)..*/.#
0c60: 69 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a  ifndef MAX_PATH.
0c70: 23 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  #  define MAX_PA
0c80: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
0c90: 20 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65          (260).#e
0ca0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0cb0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0cc0: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0cd0: 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20  or Win32.  This 
0ce0: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0cf0: 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a  be.** MAX_PATH..
0d00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0d10: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d20: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0d30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d40: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28  X_PATH_CHARS   (
0d50: 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66  MAX_PATH).#endif
0d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e  ../*.** This con
0d70: 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72  stant should alr
0d80: 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20  eady be defined 
0d90: 28 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68  (in the "WinNT.h
0da0: 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a  " SDK file)..*/.
0db0: 23 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f  #ifndef UNICODE_
0dc0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0dd0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f  .#  define UNICO
0de0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0df0: 41 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29  ARS      (32767)
0e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0e10: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0e20: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0e30: 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68  ) for WinNT.  Th
0e40: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0e50: 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45  ly be.** UNICODE
0e60: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0e70: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  S..*/.#ifndef SQ
0e80: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0e90: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0ea0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  ine SQLITE_WINNT
0eb0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0ec0: 20 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e    (UNICODE_STRIN
0ed0: 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e  G_MAX_CHARS).#en
0ee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0ef0: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0f00: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0f10: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0f20: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0f30: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0f40: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0f50: 20 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61   4 bytes per cha
0f60: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
0f70: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
0f80: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
0f90: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
0fa0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0fb0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0fc0: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0fd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0fe0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0ff0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
1000: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
1010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1020: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
1030: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
1040: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
1050: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1060: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f  y be.** UNICODE_
1070: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
1080: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
1090: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10a0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
10b0: 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69  TH_BYTES.#  defi
10c0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ne SQLITE_WINNT_
10d0: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20  MAX_PATH_BYTES  
10e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1100: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20  sizeof(WCHAR) * 
1110: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
1120: 5f 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e  _PATH_CHARS).#en
1130: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
1140: 75 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  um error message
1150: 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72   length (in char
1160: 73 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f  s) for WinRT..*/
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
1190: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
11a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
11b0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28  X_ERRMSG_CHARS (
11c0: 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  1024).#endif../*
11d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
11e0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72  zero if the char
11f0: 61 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20  acter should be 
1200: 74 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72  treated as a dir
1210: 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61  ectory.** separa
1220: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
1230: 77 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64  winIsDirSep.#  d
1240: 65 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65  efine winIsDirSe
1250: 70 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  p(a)            
1260: 20 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27      (((a) == '/'
1270: 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c  ) || ((a) == '\\
1280: 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ')).#endif../*.*
1290: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  * This macro is 
12a0: 75 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61  used when a loca
12b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  l variable is se
12c0: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61  t to a value tha
12d0: 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d  t is.** [sometim
12e0: 65 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  es] not used by 
12f0: 74 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76  the code (e.g. v
1300: 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  ia conditional c
1310: 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a  ompilation)..*/.
1320: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56  #ifndef UNUSED_V
1330: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20  ARIABLE_VALUE.# 
1340: 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56   define UNUSED_V
1350: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29  ARIABLE_VALUE(x)
1360: 20 20 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a        (void)(x).
1370: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1380: 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61 63  turns the charac
1390: 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ter that should 
13a0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 64  be used as the d
13b0: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
13c0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77  or..*/.#ifndef w
13d0: 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20 64  inGetDirSep.#  d
13e0: 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53  efine winGetDirS
13f0: 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ep()            
1400: 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a      '\\'.#endif.
1410: 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65  ./*.** Do we nee
1420: 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65  d to manually de
1430: 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66  fine the Win32 f
1440: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73  ile mapping APIs
1450: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41   for use with WA
1460: 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d  L.** mode or mem
1470: 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
1480: 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49   (e.g. these API
1490: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
14a0: 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a  in the Windows.*
14b0: 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  * CE SDK; howeve
14c0: 72 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  r, they are not 
14d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68  present in the h
14e0: 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a  eader file)?.*/.
14f0: 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  #if SQLITE_WIN32
1500: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
1510: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
1520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1530: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
1540: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1550: 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66  >0)./*.** Two of
1560: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e   the file mappin
1570: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65  g APIs are diffe
1580: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54  rent under WinRT
1590: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
15a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65  ich.** set we ne
15b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
15c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41  E_OS_WINRT.WINBA
15d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
15e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
15f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e  ppingFromApp(HAN
1600: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
1610: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
1620: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  UTES, ULONG, ULO
1630: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a  NG64, LPCWSTR);.
1640: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
1650: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
1660: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48  wOfFileFromApp(H
1670: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c  ANDLE, ULONG, UL
1680: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a  ONG64, SIZE_T);.
1690: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
16a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
16b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45  AS_ANSI).WINBASE
16c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
16d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
16e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingA(HANDLE, LPS
16f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1700: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1710: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1720: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64  D, LPCSTR);.#end
1730: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1750: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  NSI) */..#if def
1760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1770: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42  2_HAS_WIDE).WINB
1780: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1790: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
17a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20  appingW(HANDLE, 
17b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
17c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
17d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
17e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a  WORD, LPCWSTR);.
17f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1800: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1810: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e  AS_WIDE) */..WIN
1820: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
1830: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
1840: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52  ile(HANDLE, DWOR
1850: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1860: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66   SIZE_T);.#endif
1870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1880: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NRT */../*.** Th
1890: 65 73 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ese file mapping
18a0: 20 41 50 49 73 20 61 72 65 20 63 6f 6d 6d 6f 6e   APIs are common
18b0: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
18c0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 0a 57 49  nd WinRT..*/..WI
18d0: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
18e0: 4e 41 50 49 20 46 6c 75 73 68 56 69 65 77 4f 66  NAPI FlushViewOf
18f0: 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c 20 53 49  File(LPCVOID, SI
1900: 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53 45 41 50  ZE_T);.WINBASEAP
1910: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
1920: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
1930: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1940: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1950: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 2a  ILEMAPPING_API *
1960: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
1970: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
1980: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
1990: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
19a0: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ef INVALID_FILE_
19b0: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66  ATTRIBUTES.# def
19c0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  ine INVALID_FILE
19d0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57  _ATTRIBUTES ((DW
19e0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
19f0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
1a00: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
1a10: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
1a20: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
1a30: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
1a40: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
1a50: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
1a60: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
1a70: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
1a80: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
1a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
1ab0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1ac0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
1ad0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64  for WAL */.typed
1ae0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
1af0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20   winShm;        
1b00: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69     /* A connecti
1b10: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1b20: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1b40: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f   winShmNode;   /
1b50: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68  * A region of sh
1b60: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23  ared-memory */.#
1b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
1b80: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
1b90: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
1ba0: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
1bb0: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
1bc0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
1bd0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
1be0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1bf0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75  NCE.typedef stru
1c00: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20  ct winceLock {. 
1c10: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20   int nReaders;  
1c20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c30: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f  f reader locks o
1c40: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1c50: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  L bPending;     
1c60: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1c70: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
1c80: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1c90: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76  /.  BOOL bReserv
1ca0: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  ed;     /* Indic
1cb0: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20  ates a reserved 
1cc0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1cd0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
1ce0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20   bExclusive;    
1cf0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20  /* Indicates an 
1d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68  exclusive lock h
1d10: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1d20: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b   */.} winceLock;
1d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d40: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63  he winFile struc
1d50: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61  ture is a subcla
1d60: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1d70: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20  le* specific to 
1d80: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72  the win32.** por
1d90: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a  tability layer..
1da0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1db0: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c  t winFile winFil
1dc0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c  e;.struct winFil
1dd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  e {.  const sqli
1de0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1df0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75  pMethod; /*** Mu
1e00: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f  st be first ***/
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e20: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68  pVfs;      /* Th
1e30: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70  e VFS used to op
1e40: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  en this file */.
1e50: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20    HANDLE h;     
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1e70: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1e80: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
1e90: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  u8 locktype;    
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
1eb0: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
1ec0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
1ed0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73  ile */.  short s
1ee0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20  haredLockByte;  
1ef0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f   /* Randomly cho
1f00: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73  sen byte used as
1f10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a   a shared lock *
1f20: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73  /.  u8 ctrlFlags
1f30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
1f40: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49  lags.  See WINFI
1f50: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  LE_* below */.  
1f60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1f80: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1f90: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1fa0: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rror */.#ifndef 
1fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1fc0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20    winShm *pShm; 
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1fe0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20  tance of shared 
1ff0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66  memory on this f
2000: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
2010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2020: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
2030: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
2040: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
2050: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
2060: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
2070: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
2080: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
2090: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
20a0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
20b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
20c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
20d0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
20e0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
20f0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
2100: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
2110: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
2120: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
2130: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ock */.  HANDLE 
2140: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
2150: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
2160: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
2170: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
2180: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
2190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
21a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
21b0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
21c0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
21d0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
21e0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
21f0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
2200: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
2210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2220: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2230: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
2240: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
2270: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
2280: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
22b0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
22c0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
22d0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22f0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
2300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2310: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
2320: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
2330: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
2340: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2350: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
2360: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
2370: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
2380: 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
2390: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 56  ../*.** The winV
23a0: 66 73 41 70 70 44 61 74 61 20 73 74 72 75 63 74  fsAppData struct
23b0: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
23c0: 74 68 65 20 70 41 70 70 44 61 74 61 20 6d 65 6d  the pAppData mem
23d0: 62 65 72 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  ber for all of t
23e0: 68 65 0a 2a 2a 20 57 69 6e 33 32 20 56 46 53 20  he.** Win32 VFS 
23f0: 76 61 72 69 61 6e 74 73 2e 0a 2a 2f 0a 74 79 70  variants..*/.typ
2400: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 56  edef struct winV
2410: 66 73 41 70 70 44 61 74 61 20 77 69 6e 56 66 73  fsAppData winVfs
2420: 41 70 70 44 61 74 61 3b 0a 73 74 72 75 63 74 20  AppData;.struct 
2430: 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 7b 0a  winVfsAppData {.
2440: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2450: 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
2460: 68 6f 64 3b 20 2f 2a 20 54 68 65 20 66 69 6c 65  hod; /* The file
2470: 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 74 6f 20   I/O methods to 
2480: 75 73 65 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  use. */.  void *
2490: 70 41 70 70 44 61 74 61 3b 20 20 20 20 20 20 20  pAppData;       
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b0: 54 68 65 20 65 78 74 72 61 20 70 41 70 70 44 61  The extra pAppDa
24c0: 74 61 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ta, if any. */. 
24d0: 20 42 4f 4f 4c 20 62 4e 6f 4c 6f 63 6b 3b 20 20   BOOL bNoLock;  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20      /* Non-zero 
2500: 69 66 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 69  if locking is di
2510: 73 61 62 6c 65 64 2e 20 2a 2f 0a 7d 3b 0a 0a 2f  sabled. */.};../
2520: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2530: 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e  ues for winFile.
2540: 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  ctrlFlags.*/.#de
2550: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f  fine WINFILE_RDO
2560: 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30  NLY          0x0
2570: 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f  2   /* Connectio
2580: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
2590: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
25a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20  E_PERSIST_WAL   
25b0: 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73    0x04   /* Pers
25c0: 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20  istent WAL mode 
25d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
25e0: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20  LE_PSOW         
25f0: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c     0x10   /* SQL
2600: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
2610: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
2620: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65  ../*. * The size
2630: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75   of the buffer u
2640: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  sed by sqlite3_w
2650: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
2660: 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ().. */.#ifndef 
2670: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
2680: 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66  _BUF_SIZE.#  def
2690: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
26a0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20  _DBG_BUF_SIZE   
26b0: 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65  ((int)(4096-size
26c0: 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64  of(DWORD))).#end
26d0: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
26e0: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
26f0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
2700: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
2710: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
2720: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
2730: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
2740: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
2750: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
2760: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
2770: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
2780: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
2790: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
27a0: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
27b0: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
27c0: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
27d0: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
27e0: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
27f0: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
2800: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
2810: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
2820: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
2830: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
2840: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
2850: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
2860: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
2870: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2880: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
2890: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
28a0: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
2900: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
2910: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
2920: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
2930: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
2940: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
2950: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
2960: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
2970: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
2980: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
2990: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
29a0: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
29b0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
29c0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
29d0: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
29e0: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
29f0: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
2a00: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
2a10: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
2a20: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
2a30: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
2a40: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
2a50: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
2a60: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
2a70: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
2a80: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
2a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad0: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
2ae0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2af0: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
2b00: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2b10: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 20 20  EAP_CREATE      
2b20: 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a    (TRUE).#endif.
2b30: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74  ./*. * This is t
2b40: 68 65 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  he maximum possi
2b50: 62 6c 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65  ble initial size
2b60: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70   of the Win32-sp
2b70: 65 63 69 66 69 63 20 68 65 61 70 2c 20 69 6e 0a  ecific heap, in.
2b80: 20 2a 20 62 79 74 65 73 2e 0a 20 2a 2f 0a 23 69   * bytes.. */.#i
2b90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2ba0: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49 4e 49 54  32_HEAP_MAX_INIT
2bb0: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
2bc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2bd0: 50 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 20  P_MAX_INIT_SIZE 
2be0: 28 34 32 39 34 39 36 37 32 39 35 55 29 0a 23 65  (4294967295U).#e
2bf0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73  ndif../*. * This
2c00: 20 69 73 20 74 68 65 20 65 78 74 72 61 20 73 70   is the extra sp
2c10: 61 63 65 20 66 6f 72 20 74 68 65 20 69 6e 69 74  ace for the init
2c20: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
2c30: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2c40: 65 61 70 2c 0a 20 2a 20 69 6e 20 62 79 74 65 73  eap,. * in bytes
2c50: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2c60: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2c70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
2c80: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45 58  N32_HEAP_INIT_EX
2c90: 54 52 41 0a 23 20 20 64 65 66 69 6e 65 20 53 51  TRA.#  define SQ
2ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2cb0: 49 4e 49 54 5f 45 58 54 52 41 20 20 28 34 31 39  INIT_EXTRA  (419
2cc0: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
2cd0: 0a 20 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68  . * Calculate th
2ce0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
2cf0: 63 61 63 68 65 20 73 69 7a 65 2c 20 69 6e 20 70  cache size, in p
2d00: 61 67 65 73 2c 20 62 61 73 65 64 20 6f 6e 20 74  ages, based on t
2d10: 68 65 20 6d 61 78 69 6d 75 6d 0a 20 2a 20 70 6f  he maximum. * po
2d20: 73 73 69 62 6c 65 20 69 6e 69 74 69 61 6c 20 68  ssible initial h
2d30: 65 61 70 20 73 69 7a 65 20 61 6e 64 20 74 68 65  eap size and the
2d40: 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2d50: 7a 65 2c 20 73 65 74 74 69 6e 67 20 61 73 69 64  ze, setting asid
2d60: 65 20 74 68 65 0a 20 2a 20 6e 65 65 64 65 64 20  e the. * needed 
2d70: 65 78 74 72 61 20 73 70 61 63 65 2e 0a 20 2a 2f  extra space.. */
2d80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d90: 57 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f  WIN32_MAX_CACHE_
2da0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
2db0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
2dc0: 43 41 43 48 45 5f 53 49 5a 45 20 20 20 28 28 28  CACHE_SIZE   (((
2dd0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2de0: 50 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 29  P_MAX_INIT_SIZE)
2df0: 20 2d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   - \.           
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2e30: 50 5f 49 4e 49 54 5f 45 58 54 52 41 29 29 20 2f  P_INIT_EXTRA)) /
2e40: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
2e70: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2e80: 5f 53 49 5a 45 29 29 0a 23 65 6e 64 69 66 0a 0a  _SIZE)).#endif..
2e90: 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 63 61  /*. * This is ca
2ea0: 63 68 65 20 73 69 7a 65 20 75 73 65 64 20 69 6e  che size used in
2eb0: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 69 6f 6e   the calculation
2ec0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20   of the initial 
2ed0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 2a 20 57  size of the. * W
2ee0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65  in32-specific he
2ef0: 61 70 2e 20 20 49 74 20 63 61 6e 6e 6f 74 20 62  ap.  It cannot b
2f00: 65 20 6e 65 67 61 74 69 76 65 2e 0a 20 2a 2f 0a  e negative.. */.
2f10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2f20: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a  IN32_CACHE_SIZE.
2f30: 23 20 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46  #  if SQLITE_DEF
2f40: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3e  AULT_CACHE_SIZE>
2f50: 3d 30 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  =0.#    define S
2f60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48  QLITE_WIN32_CACH
2f70: 45 5f 53 49 5a 45 20 20 20 20 20 28 53 51 4c 49  E_SIZE     (SQLI
2f80: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
2f90: 5f 53 49 5a 45 29 0a 23 20 20 65 6c 73 65 0a 23  _SIZE).#  else.#
2fa0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
2fb0: 45 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49  E_WIN32_CACHE_SI
2fc0: 5a 45 20 20 20 20 20 28 2d 28 53 51 4c 49 54 45  ZE     (-(SQLITE
2fd0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
2fe0: 49 5a 45 29 29 0a 23 20 20 65 6e 64 69 66 0a 23  IZE)).#  endif.#
2ff0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 4d 61 6b  endif../*. * Mak
3000: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
3010: 63 61 6c 63 75 6c 61 74 65 64 20 63 61 63 68 65  calculated cache
3020: 20 73 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c   size, in pages,
3030: 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 74 68   cannot cause th
3040: 65 0a 20 2a 20 69 6e 69 74 69 61 6c 20 73 69 7a  e. * initial siz
3050: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
3060: 70 65 63 69 66 69 63 20 68 65 61 70 20 74 6f 20  pecific heap to 
3070: 65 78 63 65 65 64 20 74 68 65 20 6d 61 78 69 6d  exceed the maxim
3080: 75 6d 20 61 6d 6f 75 6e 74 0a 20 2a 20 6f 66 20  um amount. * of 
3090: 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20  memory that can 
30a0: 62 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  be specified in 
30b0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 48 65 61 70  the call to Heap
30c0: 43 72 65 61 74 65 2e 0a 20 2a 2f 0a 23 69 66 20  Create.. */.#if 
30d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43  SQLITE_WIN32_CAC
30e0: 48 45 5f 53 49 5a 45 3e 53 51 4c 49 54 45 5f 57  HE_SIZE>SQLITE_W
30f0: 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f 53  IN32_MAX_CACHE_S
3100: 49 5a 45 0a 23 20 20 75 6e 64 65 66 20 53 51 4c  IZE.#  undef SQL
3110: 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f  ITE_WIN32_CACHE_
3120: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
3130: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48  QLITE_WIN32_CACH
3140: 45 5f 53 49 5a 45 20 20 20 20 20 20 20 28 32 30  E_SIZE       (20
3150: 30 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  00).#endif../*. 
3160: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69  * The initial si
3170: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
3180: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
3190: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
31a0: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
31b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
31c0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a  _HEAP_INIT_SIZE.
31d0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
31e0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
31f0: 5f 53 49 5a 45 20 20 20 28 28 53 51 4c 49 54 45  _SIZE   ((SQLITE
3200: 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a  _WIN32_CACHE_SIZ
3210: 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20  E) * \.         
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
3250: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 5c 0a 20  PAGE_SIZE) + \. 
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
3290: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
32a0: 45 58 54 52 41 29 29 0a 23 65 6e 64 69 66 0a 0a  EXTRA)).#endif..
32b0: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
32c0: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  m size of the Wi
32d0: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
32e0: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
32f0: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
3300: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
3310: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
3320: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
3330: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
3340: 41 58 5f 53 49 5a 45 20 20 20 20 28 30 29 0a 23  AX_SIZE    (0).#
3350: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
3360: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
3370: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
3380: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
3390: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
33a0: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
33b0: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
33c0: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
33d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
33e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
33f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3400: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
3410: 20 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66        (0).#endif
3420: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  .../*.** The win
3430: 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72  MemData structur
3440: 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61  e stores informa
3450: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
3460: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
3470: 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  fic.** sqlite3_m
3480: 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65  em_methods imple
3490: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mentation..*/.ty
34a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
34b0: 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61  MemData winMemDa
34c0: 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65  ta;.struct winMe
34d0: 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20  mData {.#ifndef 
34e0: 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67  NDEBUG.  u32 mag
34f0: 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20  ic1;   /* Magic 
3500: 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74  number to detect
3510: 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
3520: 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66  ption. */.#endif
3530: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
3540: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
3550: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
3560: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
3570: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
3580: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
3590: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
35a0: 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  n)? */.#ifndef N
35b0: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
35c0: 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c2;   /* Magic n
35d0: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
35e0: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
35f0: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
3600: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
3610: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
3620: 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30 78 34  M_MAGIC1     0x4
3630: 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e 65 20  2b2830b.#define 
3640: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20  WINMEM_MAGIC2   
3650: 20 20 30 78 62 64 34 64 37 63 66 34 0a 23 65 6e    0xbd4d7cf4.#en
3660: 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75  dif..static stru
3670: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
3680: 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23  n_mem_data = {.#
3690: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
36a0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23  WINMEM_MAGIC1,.#
36b0: 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41  endif.  NULL, FA
36c0: 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  LSE.#ifndef NDEB
36d0: 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47  UG.  ,WINMEM_MAG
36e0: 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23  IC2.#endif.};..#
36f0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
3700: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
3710: 72 74 4d 61 67 69 63 31 28 29 20 61 73 73 65 72  rtMagic1() asser
3720: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
3730: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
3740: 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e 65 20  AGIC1 ).#define 
3750: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
3760: 63 32 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c2() assert( win
3770: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32  _mem_data.magic2
3780: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
3790: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ).#define winMem
37a0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 20 20 77  AssertMagic()  w
37b0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
37c0: 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72  1(); winMemAsser
37d0: 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c 73 65  tMagic2();.#else
37e0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
37f0: 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e  ssertMagic().#en
3800: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e  dif..#define win
3810: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 20  MemGetDataPtr() 
3820: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23   &win_mem_data.#
3830: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
3840: 48 65 61 70 28 29 20 20 20 20 20 77 69 6e 5f 6d  Heap()     win_m
3850: 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 23 64  em_data.hHeap.#d
3860: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f  efine winMemGetO
3870: 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f 6d 65  wned()    win_me
3880: 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73  m_data.bOwned..s
3890: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
38a0: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
38b0: 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  tes);.static voi
38c0: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
38d0: 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74  d *pPrior);.stat
38e0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
38f0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
3900: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
3910: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
3920: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
3930: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
3940: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
3950: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
3960: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
3970: 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63  AppData);.static
3980: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
3990: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
39a0: 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c  ata);..const sql
39b0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
39c0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
39d0: 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64  in32(void);.#end
39e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
39f0: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
3a00: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3a10: 67 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e  g variable is (n
3a20: 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63  ormally) set onc
3a30: 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e  e and never chan
3a40: 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65  ges.** thereafte
3a50: 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77  r.  It records w
3a60: 68 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61  hether the opera
3a70: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3a80: 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54  in9x.** or WinNT
3a90: 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65  ..**.** 0:   Ope
3aa0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e  rating system un
3ab0: 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f  known..** 1:   O
3ac0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3ad0: 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20  is Win9x..** 2: 
3ae0: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
3af0: 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  em is WinNT..**.
3b00: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66  ** In order to f
3b10: 61 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e  acilitate testin
3b20: 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73  g on a WinNT sys
3b30: 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69  tem, the test fi
3b40: 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e  xture.** can man
3b50: 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76  ually set this v
3b60: 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75  alue to 1 to emu
3b70: 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76  late Win98 behav
3b80: 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ior..*/.#ifdef S
3b90: 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e 47 20  QLITE_TEST.LONG 
3ba0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c  SQLITE_WIN32_VOL
3bb0: 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73  ATILE sqlite3_os
3bc0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65  _type = 0;.#else
3bd0: 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53 51 4c  .static LONG SQL
3be0: 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49  ITE_WIN32_VOLATI
3bf0: 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  LE sqlite3_os_ty
3c00: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
3c10: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
3c20: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
3c30: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
3c40: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a  l_ptr.#endif../*
3c50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c60: 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  n is not availab
3c70: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
3c80: 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a   or WinRT.. */..
3c90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3ca0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
3cb0: 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65  _WINRT.#  define
3cc0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3cd0: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e  SI()       1.#en
3ce0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20  dif../*.** Many 
3cf0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65  system calls are
3d00: 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67   accessed throug
3d10: 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e  h pointer-to-fun
3d20: 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a  ctions so that.*
3d30: 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76  * they may be ov
3d40: 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74  erridden at runt
3d50: 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74  ime to facilitat
3d60: 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f  e fault injectio
3d70: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  n during.** test
3d80: 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69  ing and sandboxi
3d90: 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ng.  The followi
3da0: 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74  ng array holds t
3db0: 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69  he names and poi
3dc0: 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20  nters.** to all 
3dd0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
3de0: 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74  tem calls..*/.st
3df0: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f  atic struct win_
3e00: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
3e10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
3e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3e30: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
3e40: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
3e50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
3e60: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
3e70: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
3e80: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
3e90: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3ea0: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
3eb0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
3ec0: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
3ed0: 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  = {.#if !SQLITE_
3ee0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
3ef0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
3f00: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
3f10: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
3f20: 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73  CALL)AreFileApis
3f30: 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20  ANSI,         0 
3f40: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72  },.#else.  { "Ar
3f50: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
3f60: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3f70: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3f80: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3f90: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
3fa0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
3fb0: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
3fc0: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
3fd0: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
3fe0: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
3ff0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
4000: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4010: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
4020: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4030: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f  IDE).  { "CharLo
4040: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
4050: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
4060: 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20  rLowerW,        
4070: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4080: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
4090: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
40a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
40d0: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77  define osCharLow
40e0: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
40f0: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
4100: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
4110: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4120: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4130: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4140: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4150: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
4160: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4170: 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20  LL)CharUpperW,  
4180: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4190: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72  .#else.  { "Char
41a0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
41b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
41c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
41d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
41e0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
41f0: 68 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53  harUpperW ((LPWS
4200: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53  TR(WINAPI*)(LPWS
4210: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  TR))aSyscall[2].
4220: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4230: 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20  CloseHandle",   
4240: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4250: 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20  LL)CloseHandle, 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4270: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ..#define osClos
4280: 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57  eHandle ((BOOL(W
4290: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
42a0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
42b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
42c0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
42d0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43  HAS_ANSI).  { "C
42e0: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
42f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4300: 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20  L)CreateFileA,  
4310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4320: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
4330: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
4340: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4370: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
4380: 65 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44  eateFileA ((HAND
4390: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
43a0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  TR,DWORD,DWORD, 
43b0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
43c0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
43d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44  DWORD,DWORD,HAND
43e0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  LE))aSyscall[4].
43f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4400: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4410: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4420: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4430: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
4440: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
4450: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
4460: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
4470: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4480: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
44a0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
44c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
44d0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
44e0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
44f0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
4500: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
4510: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
4520: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
4530: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
4540: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
4550: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4560: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4580: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
4590: 20 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65          (!define
45a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
45b0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
45c0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20 26 26  _MMAP_SIZE>0) &&
45d0: 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   \.        SQLIT
45e0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
45f0: 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b 20 22  LEMAPPINGA.  { "
4600: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
4610: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
4620: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
4630: 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  pingA,      0 },
4640: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
4650: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
4660: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4680: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4690: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
46a0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
46b0: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
46c0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
46d0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
46e0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
46f0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4700: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36  CSTR))aSyscall[6
4710: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4720: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4730: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
4740: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
4750: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4760: 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20  S_WIDE) && \.   
4770: 20 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53       (!defined(S
4780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
4790: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
47a0: 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20  AP_SIZE>0)).  { 
47b0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
47c0: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
47d0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
47e0: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
47f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
4800: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
4810: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4820: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4830: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4840: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4850: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
4860: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
4870: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
4880: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4890: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
48a0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
48b0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
48c0: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
48d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
48e0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
48f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4900: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
4910: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
4920: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
4930: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
4940: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4950: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
4960: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
4970: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
49a0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
49b0: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
49c0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
49d0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
49e0: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
49f0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4a00: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
4a10: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4a20: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4a30: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
4a40: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
4a50: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
4a60: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
4a70: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4a80: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4aa0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4ac0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4ad0: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
4ae0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4af0: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4b00: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
4b10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4b20: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4b30: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
4b40: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
4b50: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
4b60: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
4b70: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4b80: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4ba0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4bd0: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4be0: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
4bf0: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
4c00: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
4c10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4c20: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
4c30: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
4c40: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
4c50: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
4c60: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
4c70: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
4c80: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4c90: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4cc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
4cd0: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4ce0: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
4cf0: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
4d00: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4d10: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4d20: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
4d30: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
4d40: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
4d50: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
4d60: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
4d70: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
4d80: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
4d90: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4da0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4de0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4df0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4e00: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4e10: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4e20: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
4e30: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
4e40: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
4e50: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
4e60: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
4e70: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
4e80: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
4e90: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4ea0: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
4eb0: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
4ec0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4ed0: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
4ee0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4ef0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4f00: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
4f10: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
4f20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
4f30: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
4f40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4f50: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
4f60: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
4f70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4fa0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4fb0: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
4fc0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4fd0: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4fe0: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
4ff0: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
5000: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
5010: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
5020: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5030: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5040: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
5050: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
5060: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
5070: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
5080: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5090: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
50a0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
50b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
50d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
50e0: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
50f0: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
5100: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
5110: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
5120: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
5130: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
5140: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
5150: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
5160: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5170: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
5180: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
5190: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
51a0: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
51b0: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
51c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
51d0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
51f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5210: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5220: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
5230: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
5240: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
5250: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
5260: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
5270: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
5280: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
5290: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
52a0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
52b0: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
52c0: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
52d0: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
52e0: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
52f0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5300: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
5310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5320: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5330: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
5340: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
5350: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
5360: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
5370: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5380: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
5390: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
53a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
53b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
53c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
53d0: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
53e0: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
53f0: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
5400: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
5410: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5420: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
5430: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
5440: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5450: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
5460: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5470: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5480: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5490: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
54a0: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
54b0: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
54c0: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
54d0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
54e0: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
54f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5520: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5530: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
5540: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5550: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
5560: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
5570: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
5580: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
5590: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
55a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
55b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
55c0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
55d0: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
55e0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
55f0: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
5600: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5610: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
5620: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
5630: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5640: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5650: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5660: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
5670: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
5680: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
5690: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
56a0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
56b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
56c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
56d0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
56e0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
56f0: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
5700: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
5710: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
5720: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5730: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5740: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
5750: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5760: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5770: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5780: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
5790: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
57a0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
57b0: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
57c0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
57d0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
57e0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
57f0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5800: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
5810: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
5820: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
5830: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
5840: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
5850: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5880: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5890: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
58a0: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
58b0: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
58c0: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
58d0: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
58e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
58f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5900: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5910: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
5920: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
5930: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
5940: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
5950: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5960: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5980: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
59a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
59b0: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
59c0: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
59d0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
59e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
59f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5a00: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5a10: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5a20: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5a30: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
5a40: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
5a50: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
5a60: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
5a70: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5a80: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5a90: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5aa0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5ac0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5ad0: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5ae0: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
5af0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
5b00: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
5b10: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
5b20: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
5b30: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5b40: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
5b50: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5b60: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5b70: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5b80: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5b90: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
5ba0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5bb0: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
5bc0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5bd0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5be0: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5bf0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5c20: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
5c30: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
5c40: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
5c50: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
5c60: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
5c70: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
5c80: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5c90: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
5ca0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5cb0: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
5cc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5cd0: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
5ce0: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
5cf0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
5d00: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
5d10: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
5d20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
5d30: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
5d40: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
5d50: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
5d60: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
5d70: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
5d80: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
5d90: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
5da0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5db0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5dc0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
5dd0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
5de0: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
5df0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
5e00: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
5e10: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
5e20: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
5e30: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
5e40: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
5e50: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
5e60: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
5e70: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
5e80: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5e90: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
5ea0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
5eb0: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
5ec0: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5ed0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f00: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
5f10: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
5f20: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
5f30: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
5f40: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
5f50: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
5f60: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5f70: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
5f80: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
5f90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5fa0: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
5fb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5fc0: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5fd0: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5fe0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6010: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
6020: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
6030: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
6040: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
6050: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
6060: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
6070: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6080: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
6090: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
60a0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
60b0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
60c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
60d0: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
60e0: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
60f0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6100: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
6110: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
6120: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
6130: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
6140: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
6150: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
6160: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
6170: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
61a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
61b0: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
61c0: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
61d0: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
61e0: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
61f0: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
6200: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6210: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6220: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
6230: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
6240: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
6250: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
6260: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6270: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
6280: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
6290: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
62c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
62d0: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
62e0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
62f0: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
6300: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
6310: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6320: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
6330: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
6340: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
6350: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
6360: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
6370: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
6380: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6390: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
63a0: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
63b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
63e0: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
63f0: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
6400: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
6410: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
6420: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6430: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6440: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
6450: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
6460: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
6470: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
6480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6490: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
64a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
64b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
64d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
64e0: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
64f0: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
6500: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
6510: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
6520: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6530: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
6540: 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57  NSI) && SQLITE_W
6550: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
6560: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
6570: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
6580: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
6590: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
65a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
65b0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
65c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
65d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
65f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6600: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
6610: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
6620: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
6630: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
6640: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
6650: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6660: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6680: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
6690: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
66a0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
66b0: 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56  SIONEX.  { "GetV
66c0: 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20  ersionExW",     
66d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
66e0: 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20  etVersionExW,   
66f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6700: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
6710: 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  onExW",         
6720: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6750: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
6760: 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28  rsionExW ((BOOL(
6770: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
6780: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
6790: 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOW))aSyscall[3
67a0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
67b0: 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20  { "HeapAlloc",  
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
67d0: 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c  SCALL)HeapAlloc,
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
67f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
6800: 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  eapAlloc ((LPVOI
6810: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
6820: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
6830: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
6840: 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74  all[36].pCurrent
6850: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6860: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6870: 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20  pCreate",       
6880: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6890: 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20  HeapCreate,     
68a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
68b0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65  lse.  { "HeapCre
68c0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
68d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6900: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6910: 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28  Create ((HANDLE(
6920: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53  WINAPI*)(DWORD,S
6930: 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20  IZE_T, \.       
6940: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6950: 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[37].pCurrent).
6960: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6970: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44  WINRT.  { "HeapD
6980: 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20  estroy",        
6990: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
69a0: 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  apDestroy,      
69b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
69c0: 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72  e.  { "HeapDestr
69d0: 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oy",            
69e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6a10: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65  #define osHeapDe
6a20: 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e  stroy ((BOOL(WIN
6a30: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
6a40: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
6a50: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46  ent)..  { "HeapF
6a60: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
6a70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6a80: 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  apFree,         
6a90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6aa0: 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20  fine osHeapFree 
6ab0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6ac0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56  HANDLE,DWORD,LPV
6ad0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39  OID))aSyscall[39
6ae0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6af0: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20   "HeapReAlloc", 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6b10: 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63  CALL)HeapReAlloc
6b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
6b30: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6b40: 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  apReAlloc ((LPVO
6b50: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
6b60: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c  LE,DWORD,LPVOID,
6b70: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6b80: 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e  T))aSyscall[40].
6b90: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6ba0: 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20  HeapSize",      
6bb0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6bc0: 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20  LL)HeapSize,    
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6be0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6bf0: 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49  Size ((SIZE_T(WI
6c00: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6c10: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
6c20: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
6c30: 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [41].pCurrent)..
6c40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6c50: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61  INRT.  { "HeapVa
6c60: 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20  lidate",        
6c70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6c80: 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20  pValidate,      
6c90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6ca0: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
6cb0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
6cc0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6cf0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c  define osHeapVal
6d00: 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e  idate ((BOOL(WIN
6d10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6d20: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6d30: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
6d40: 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  42].pCurrent)..#
6d50: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6d60: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
6d70: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6d80: 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20  pCompact",      
6d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6da0: 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20 20 20  HeapCompact,    
6db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6dc0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d  lse.  { "HeapCom
6dd0: 70 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20  pact",          
6de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6e10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6e20: 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54 28 57  Compact ((UINT(W
6e30: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6e40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6e50: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
6e60: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6e70: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
6e80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6e90: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
6ea0: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
6eb0: 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20  adLibraryA",    
6ec0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6ed0: 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20  )LoadLibraryA,  
6ee0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6ef0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
6f00: 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20  braryA",        
6f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6f40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
6f50: 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44  dLibraryA ((HMOD
6f60: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
6f70: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 34  STR))aSyscall[44
6f80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6f90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6fa0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
6fb0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
6fc0: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
6fd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6fe0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
6ff0: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  SION).  { "LoadL
7000: 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20  ibraryW",       
7010: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
7020: 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20  adLibraryW,     
7030: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7040: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
7050: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
7060: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7090: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
70a0: 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45  braryW ((HMODULE
70b0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
70c0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e  R))aSyscall[45].
70d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
70e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
70f0: 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c    { "LocalFree",
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7110: 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65  SYSCALL)LocalFre
7120: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7130: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7140: 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20  "LocalFree",    
7150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7160: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7180: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7190: 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28  e osLocalFree ((
71a0: 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28  HLOCAL(WINAPI*)(
71b0: 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c  HLOCAL))aSyscall
71c0: 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [46].pCurrent)..
71d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
71e0: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
71f0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
7200: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
7210: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7220: 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  )LockFile,      
7230: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7240: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
7250: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7260: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7290: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
72a0: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
72b0: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
72c0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
72d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
72e0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
72f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d  RD))aSyscall[47]
7300: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7310: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
7320: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63  S_WINCE.  { "Loc
7330: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
7340: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7350: 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20  LockFileEx,     
7360: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7370: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
7380: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
7390: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
73c0: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
73d0: 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f  FileEx.#define o
73e0: 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  sLockFileEx ((BO
73f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7400: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
7410: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7420: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
7430: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d  ED))aSyscall[48]
7440: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7450: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
7460: 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49  _WINCE || (!SQLI
7470: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c  TE_OS_WINRT && \
7480: 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69 6e  .        (!defin
7490: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
74a0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
74b0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a  X_MMAP_SIZE>0)).
74c0: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
74d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
74e0: 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f  SYSCALL)MapViewO
74f0: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
7500: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7510: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
7520: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7530: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7550: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7560: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
7570: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  e ((LPVOID(WINAP
7580: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
7590: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
75a0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
75b0: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
75c0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c  rrent)..  { "Mul
75d0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
75e0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
75f0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
7600: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  har,     0 },..#
7610: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79  define osMultiBy
7620: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69  teToWideChar ((i
7630: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
7640: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e  ,DWORD,LPCSTR,in
7650: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  t,LPWSTR, \.    
7660: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c      int))aSyscal
7670: 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[50].pCurrent).
7680: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f  .  { "QueryPerfo
7690: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20  rmanceCounter", 
76a0: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65  (SYSCALL)QueryPe
76b0: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
76c0: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
76d0: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
76e0: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c  ceCounter ((BOOL
76f0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
7700: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47       LARGE_INTEG
7710: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  ER*))aSyscall[51
7720: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7730: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20   "ReadFile",    
7740: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7750: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20  CALL)ReadFile,  
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7770: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  },..#define osRe
7780: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  adFile ((BOOL(WI
7790: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
77a0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
77b0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
77c0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
77d0: 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e  call[52].pCurren
77e0: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f  t)..  { "SetEndO
77f0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
7800: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45     (SYSCALL)SetE
7810: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ndOfFile,       
7820: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
7830: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  ne osSetEndOfFil
7840: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
7850: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
7860: 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[53].pCurrent)
7870: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7880: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46  _WINRT.  { "SetF
7890: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
78a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
78b0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20  etFilePointer,  
78c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
78d0: 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  se.  { "SetFileP
78e0: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
78f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7920: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69  .#define osSetFi
7930: 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52  lePointer ((DWOR
7940: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7950: 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a  E,LONG,PLONG, \.
7960: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
7970: 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72  Syscall[54].pCur
7980: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
7990: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
79a0: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
79b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
79c0: 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20  ALL)Sleep,      
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
79e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65  ,.#else.  { "Sle
79f0: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
7a00: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7a10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7a20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7a30: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7a40: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e  Sleep ((VOID(WIN
7a50: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79  API*)(DWORD))aSy
7a60: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
7a70: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d  nt)..  { "System
7a80: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c  TimeToFileTime",
7a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73      (SYSCALL)Sys
7aa0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
7ab0: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  e,    0 },..#def
7ac0: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65  ine osSystemTime
7ad0: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  ToFileTime ((BOO
7ae0: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
7af0: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a   SYSTEMTIME*, \.
7b00: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
7b10: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d  ME))aSyscall[56]
7b20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7b30: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7b40: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
7b50: 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  INRT.  { "Unlock
7b60: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7b70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c      (SYSCALL)Unl
7b80: 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20  ockFile,        
7b90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7ba0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7bb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7bc0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7bf0: 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46  ifndef osUnlockF
7c00: 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  ile.#define osUn
7c10: 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  lockFile ((BOOL(
7c20: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7c30: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
7c40: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
7c50: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  RD))aSyscall[57]
7c60: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7c70: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
7c80: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c  S_WINCE.  { "Unl
7c90: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
7ca0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7cb0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  UnlockFileEx,   
7cc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7cd0: 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  lse.  { "UnlockF
7ce0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
7cf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7d20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f  ..#define osUnlo
7d30: 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28  ckFileEx ((BOOL(
7d40: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7d50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
7d60: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
7d70: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
7d80: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
7d90: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7da0: 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e  _WINCE || !defin
7db0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
7dc0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
7dd0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
7de0: 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  { "UnmapViewOfFi
7df0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  le",         (SY
7e00: 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f  SCALL)UnmapViewO
7e10: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30  fFile,         0
7e20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
7e30: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  nmapViewOfFile",
7e40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7e50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7e60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7e70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7e80: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
7e90: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
7ea0: 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63  )(LPCVOID))aSysc
7eb0: 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74  all[59].pCurrent
7ec0: 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72  )..  { "WideChar
7ed0: 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20  ToMultiByte",   
7ee0: 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43    (SYSCALL)WideC
7ef0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20  harToMultiByte, 
7f00: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
7f10: 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  e osWideCharToMu
7f20: 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49  ltiByte ((int(WI
7f30: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
7f40: 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50  D,LPCWSTR,int,LP
7f50: 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20  STR,int, \.     
7f60: 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c     LPCSTR,LPBOOL
7f70: 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70  ))aSyscall[60].p
7f80: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
7f90: 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20  riteFile",      
7fa0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7fb0: 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20  L)WriteFile,    
7fc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7fd0: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
7fe0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7ff0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56  PI*)(HANDLE,LPCV
8000: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
8010: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
8020: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
8030: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
8040: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
8050: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
8060: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
8070: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
8080: 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20  reateEventExW,  
8090: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
80a0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  se.  { "CreateEv
80b0: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
80c0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
80f0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
8100: 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44  eEventExW ((HAND
8110: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
8120: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
8130: 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  S,LPCWSTR, \.   
8140: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
8150: 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70  ))aSyscall[62].p
8160: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
8170: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
8180: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
8190: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
81a0: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
81b0: 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20  ngleObject,     
81c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
81d0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
81e0: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
81f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8200: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8210: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8220: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
8230: 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57  Object ((DWORD(W
8240: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
8250: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
8260: 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43  )aSyscall[63].pC
8270: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
8280: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
8290: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
82a0: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
82b0: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
82c0: 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30  gleObjectEx,   0
82d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
82e0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
82f0: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
8300: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8310: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8320: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8330: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
8340: 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28  bjectEx ((DWORD(
8350: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8360: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
8370: 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b   BOOL))aSyscall[
8380: 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  64].pCurrent)..#
8390: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
83a0: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
83b0: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
83c0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
83d0: 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20  lePointerEx,    
83e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
83f0: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
8400: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
8410: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8440: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
8450: 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57  interEx ((BOOL(W
8460: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
8470: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a  ARGE_INTEGER, \.
8480: 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49          PLARGE_I
8490: 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53  NTEGER,DWORD))aS
84a0: 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72  yscall[65].pCurr
84b0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
84c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
84d0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
84e0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
84f0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e  YSCALL)GetFileIn
8500: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8510: 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  eEx, 0 },.#else.
8520: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
8530: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
8540: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  x", (SYSCALL)0, 
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8570: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49  efine osGetFileI
8580: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
8590: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
85a0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
85b0: 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f         FILE_INFO
85c0: 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53  _BY_HANDLE_CLASS
85d0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61  ,LPVOID,DWORD))a
85e0: 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72  Syscall[66].pCur
85f0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8600: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 28 21  E_OS_WINRT && (!
8610: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8620: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
8630: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
8640: 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  >0).  { "MapView
8650: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
8660: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
8670: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
8680: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
8690: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
86a0: 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28  leFromApp",    (
86b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
86e0: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
86f0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c  fFileFromApp ((L
8700: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
8710: 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  ANDLE,ULONG,ULON
8720: 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  G64, \.        S
8730: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
8740: 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  67].pCurrent)..#
8750: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8760: 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  RT.  { "CreateFi
8770: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
8780: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
8790: 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20  eFile2,         
87a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
87b0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
87c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
87d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8800: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
8810: 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  e2 ((HANDLE(WINA
8820: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
8830: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
8840: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41  \.        LPCREA
8850: 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
8860: 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79  _PARAMETERS))aSy
8870: 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65  scall[68].pCurre
8880: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
8890: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
88a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
88b0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
88c0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
88d0: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
88e0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63  (SYSCALL)LoadPac
88f0: 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20  kagedLibrary,   
8900: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8910: 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69   "LoadPackagedLi
8920: 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53  brary",     (SYS
8930: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8950: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8960: 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65  ne osLoadPackage
8970: 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55  dLibrary ((HMODU
8980: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
8990: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
89a0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
89b0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
89c0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
89d0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
89e0: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
89f0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
8a00: 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20  kCount64,       
8a10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8a20: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  { "GetTickCount6
8a30: 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  4",          (SY
8a40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8a60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8a70: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
8a80: 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47  nt64 ((ULONGLONG
8a90: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
8aa0: 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75  aSyscall[70].pCu
8ab0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8ac0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8ad0: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
8ae0: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
8af0: 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73  ALL)GetNativeSys
8b00: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d  temInfo,     0 }
8b10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
8b20: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8b30: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
8b40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8b50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8b60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8b70: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
8b80: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
8b90: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
8ba0: 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53  PSYSTEM_INFO))aS
8bb0: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
8bc0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
8bd0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8be0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75  AS_ANSI).  { "Ou
8bf0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
8c00: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8c10: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
8c20: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
8c30: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
8c40: 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20  DebugStringA",  
8c50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8c80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
8c90: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20  putDebugStringA 
8ca0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
8cb0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
8cc0: 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [72].pCurrent)..
8cd0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8ce0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
8cf0: 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  E).  { "OutputDe
8d00: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
8d10: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
8d20: 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20  tDebugStringW,  
8d30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8d40: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8d50: 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  tringW",      (S
8d60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8d90: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
8da0: 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44  ugStringW ((VOID
8db0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
8dc0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e  R))aSyscall[73].
8dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
8de0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c  GetProcessHeap",
8df0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8e00: 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61  LL)GetProcessHea
8e10: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
8e20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
8e30: 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e  rocessHeap ((HAN
8e40: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  DLE(WINAPI*)(VOI
8e50: 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e  D))aSyscall[74].
8e60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
8e70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8e80: 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49  & (!defined(SQLI
8e90: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
8ea0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
8eb0: 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43 72 65  SIZE>0).  { "Cre
8ec0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8ed0: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8ee0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
8ef0: 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a  ngFromApp, 0 },.
8f00: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
8f10: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
8f20: 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  App", (SYSCALL)0
8f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8f50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
8f60: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8f70: 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28  romApp ((HANDLE(
8f80: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8f90: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
8fa0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
8fb0: 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c  ,ULONG,ULONG64,L
8fc0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
8fd0: 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [75].pCurrent)..
8fe0: 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e 20 73  /*.** NOTE: On s
8ff0: 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  ome sub-platform
9000: 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f 63 6b  s, the Interlock
9010: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
9020: 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a 2a 20  e "function".** 
9030: 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c 79 20        is really 
9040: 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74 68 61  just a macro tha
9050: 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69 6c 65  t uses a compile
9060: 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65 2e 67  r intrinsic (e.g
9070: 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20 20 20  . x64)..**      
9080: 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79 20 74   So do not try t
9090: 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73 20 69  o make this is i
90a0: 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61 62 6c  nto a redefinabl
90b0: 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  e interface..*/.
90c0: 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e 74 65  #if defined(Inte
90d0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
90e0: 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49 6e 74  change).  { "Int
90f0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
9100: 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41  xchange", (SYSCA
9110: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
9120: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
9130: 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f  define osInterlo
9140: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
9150: 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43  nge InterlockedC
9160: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 0a 23  ompareExchange.#
9170: 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65 72 6c  else.  { "Interl
9180: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
9190: 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  ange", (SYSCALL)
91a0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
91b0: 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c  reExchange, 0 },
91c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65  ..#define osInte
91d0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
91e0: 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49  change ((LONG(WI
91f0: 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a 20 20  NAPI*)(LONG \.  
9200: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
9210: 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20 4c 4f  32_VOLATILE*, LO
9220: 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63 61 6c  NG,LONG))aSyscal
9230: 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[76].pCurrent).
9240: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
9250: 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  d(InterlockedCom
9260: 70 61 72 65 45 78 63 68 61 6e 67 65 29 20 2a 2f  pareExchange) */
9270: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
9280: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
9290: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51  E_OS_WINRT && SQ
92a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55  LITE_WIN32_USE_U
92b0: 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43 72 65  UID.  { "UuidCre
92c0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
92d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 75 69      (SYSCALL)Uui
92e0: 64 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  dCreate,        
92f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
9300: 20 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 22    { "UuidCreate"
9310: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9320: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
9350: 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72 65 61  efine osUuidCrea
9360: 74 65 20 28 28 52 50 43 5f 53 54 41 54 55 53 28  te ((RPC_STATUS(
9370: 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44  RPC_ENTRY*)(UUID
9380: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 37 5d 2e  *))aSyscall[77].
9390: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
93a0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
93b0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
93c0: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
93d0: 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b  N32_USE_UUID.  {
93e0: 20 22 55 75 69 64 43 72 65 61 74 65 53 65 71 75   "UuidCreateSequ
93f0: 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59  ential",     (SY
9400: 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65  SCALL)UuidCreate
9410: 53 65 71 75 65 6e 74 69 61 6c 2c 20 20 20 30 20  Sequential,   0 
9420: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75  },.#else.  { "Uu
9430: 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 69  idCreateSequenti
9440: 61 6c 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  al",     (SYSCAL
9450: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
9460: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
9470: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
9480: 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  sUuidCreateSeque
9490: 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20 20 20 20  ntial \.        
94a0: 28 28 52 50 43 5f 53 54 41 54 55 53 28 52 50 43  ((RPC_STATUS(RPC
94b0: 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a 29 29  _ENTRY*)(UUID*))
94c0: 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70 43 75  aSyscall[78].pCu
94d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
94e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
94f0: 59 4e 43 29 20 26 26 20 53 51 4c 49 54 45 5f 4d  YNC) && SQLITE_M
9500: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
9510: 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46   { "FlushViewOfF
9520: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 28  ile",          (
9530: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 56 69 65  SYSCALL)FlushVie
9540: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
9550: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
9560: 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65 22  FlushViewOfFile"
9570: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
9580: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
9590: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
95a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
95b0: 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66 46 69   osFlushViewOfFi
95c0: 6c 65 20 5c 0a 20 20 20 20 20 20 20 20 28 28 42  le \.        ((B
95d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
95e0: 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61 53 79  VOID,SIZE_T))aSy
95f0: 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72 72 65  scall[79].pCurre
9600: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
9610: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
9620: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
9630: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
9640: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
9650: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
9660: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
9670: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
9680: 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52  win32" VFSes.  R
9690: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
96a0: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
96b0: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
96c0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
96d0: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
96e0: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
96f0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
9700: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
9710: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
9720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9730: 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
9740: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
9750: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
9760: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
9770: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
9780: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9790: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
97a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
97b0: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
97c0: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
97d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
97e0: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
97f0: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
9800: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
9810: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
9820: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
9830: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
9840: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
9850: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
9860: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9870: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
9880: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
9890: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
98a0: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
98b0: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
98c0: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
98d0: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
98e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
98f0: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
9900: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
9910: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
9920: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
9930: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
9940: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
9950: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
9960: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
9970: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
9980: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
9990: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
99a0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
99b0: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
99c0: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
99d0: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
99e0: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
99f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9a00: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
9a10: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
9a20: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
9a30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9a40: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9a50: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
9a70: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
9a80: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
9a90: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
9aa0: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
9ab0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9ac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9ad0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9ae0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
9af0: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
9b00: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
9b10: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
9b20: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
9b30: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
9b40: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
9b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9b60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9b70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
9b80: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
9b90: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
9ba0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
9bb0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
9bc0: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
9bd0: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
9be0: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
9bf0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
9c00: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
9c10: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
9c20: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
9c30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
9c40: 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d  ptr winGetSystem
9c50: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
9c60: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20  vfs *pNotUsed,. 
9c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9c80: 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  me.){.  unsigned
9c90: 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45   int i;..  UNUSE
9ca0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
9cb0: 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Used);.  for(i=0
9cc0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
9cd0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
9ce0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
9cf0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
9d00: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
9d10: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  ].zName)==0 ) re
9d20: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9d30: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20  .pCurrent;.  }. 
9d40: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9d50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
9d60: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9d70: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74   system call aft
9d80: 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e  er zName.  If zN
9d90: 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65  ame==NULL.** the
9da0: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  n return the nam
9db0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
9dc0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
9dd0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
9de0: 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  e.** is the last
9df0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20   system call or 
9e00: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
9e10: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
9e20: 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  lid.** system ca
9e30: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ll..*/.static co
9e40: 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78  nst char *winNex
9e50: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
9e60: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
9e70: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
9e80: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
9e90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9ea0: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
9eb0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
9ec0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
9ed0: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
9ee0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
9ef0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
9f00: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
9f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9f20: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
9f30: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
9f40: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
9f50: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
9f60: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
9f70: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
9f80: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
9f90: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn 0;.}..#ifdef 
9fa0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9fb0: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57  LOC./*.** If a W
9fc0: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9fd0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
9fe0: 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ured, this funct
9ff0: 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  ion will attempt
a000: 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69   to.** compact i
a010: 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73  t.  Upon success
a020: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c  , SQLITE_OK will
a030: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55   be returned.  U
a040: 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65  pon failure, one
a050: 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f  .** of SQLITE_NO
a060: 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  MEM, SQLITE_ERRO
a070: 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  R, or SQLITE_NOT
a080: 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65  FOUND will be re
a090: 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20  turned.  The.** 
a0a0: 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75  "pnLargest" argu
a0b0: 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72  ment, if non-zer
a0c0: 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  o, will be used 
a0d0: 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73 69  to return the si
a0e0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72  ze of the.** lar
a0f0: 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66  gest committed f
a100: 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65  ree block in the
a110: 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e   heap, in bytes.
a120: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a130: 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65  win32_compact_he
a140: 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67  ap(LPUINT pnLarg
a150: 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
a160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49   SQLITE_OK;.  UI
a170: 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b  NT nLargest = 0;
a180: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
a190: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
a1a0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
a1b0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
a1c0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
a1d0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
a1e0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
a1f0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
a200: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
a210: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
a220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
a230: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
a240: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
a250: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
a260: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
a270: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
a280: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53  );.#endif.#if !S
a290: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
a2a0: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
a2b0: 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65  RT.  if( (nLarge
a2c0: 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74  st=osHeapCompact
a2d0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
a2e0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29  IN32_HEAP_FLAGS)
a2f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52  )==0 ){.    DWOR
a300: 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  D lastErrno = os
a310: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
a320: 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
a330: 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20  o==NO_ERROR ){. 
a340: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
a350: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
a360: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
a370: 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29  mpact (no space)
a380: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
a3a0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20  oid*)hHeap);.   
a3b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a3c0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
a3d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
a3e0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
a3f0: 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f  RROR, "failed to
a400: 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c   HeapCompact (%l
a410: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
a440: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
a450: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a460: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
a470: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69    }.#else.  sqli
a480: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
a490: 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64  OTFOUND, "failed
a4a0: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c   to HeapCompact,
a4b0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
a4c0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
a4d0: 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53  hHeap);.  rc = S
a4e0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
a4f0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c  #endif.  if( pnL
a500: 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67  argest ) *pnLarg
a510: 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a  est = nLargest;.
a520: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a530: 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32  /*.** If a Win32
a540: 20 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73   native heap has
a550: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a560: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
a570: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
a580: 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  ** destroy and r
a590: 65 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20  ecreate it.  If 
a5a0: 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  the Win32 native
a5b0: 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f   heap is not iso
a5c0: 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20  lated and/or.** 
a5d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  the sqlite3_memo
a5e0: 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69  ry_used() functi
a5f0: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75  on does not retu
a600: 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f  rn zero, SQLITE_
a610: 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  BUSY will.** be 
a620: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
a630: 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
a640: 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33  made to the Win3
a650: 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a  2 native heap..*
a660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
a670: 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29  n32_reset_heap()
a680: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55  {.  int rc;.  MU
a690: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
a6a0: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
a6b0: 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e  r; ) /* The main
a6c0: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
a6d0: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a6e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a6f0: 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65  Mem; )    /* The
a700: 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d   memsys static m
a710: 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  utex */.  MUTEX_
a720: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
a730: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
a740: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a750: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
a760: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
a770: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d   pMem = sqlite3M
a780: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
a790: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
a7a0: 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  M); ).  sqlite3_
a7b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
a7c0: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ter);.  sqlite3_
a7d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d  mutex_enter(pMem
a7e0: 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  );.  winMemAsser
a7f0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20  tMagic();.  if( 
a800: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21  winMemGetHeap()!
a810: 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47  =NULL && winMemG
a820: 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c  etOwned() && sql
a830: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a840: 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  ()==0 ){.    /*.
a850: 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
a860: 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75  oint, there shou
a870: 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  ld be no outstan
a880: 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ding memory allo
a890: 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a  cations on.    *
a8a0: 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73  * the heap.  Als
a8b0: 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68  o, since both th
a8c0: 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d  e master and mem
a8d0: 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75  sys locks are cu
a8e0: 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62  rrently.    ** b
a8f0: 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c  eing held by us,
a900: 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69   no other functi
a910: 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e  on (i.e. from an
a920: 6f 74 68 65 72 20 74 68 72 65 61 64 29 20 73 68  other thread) sh
a930: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61  ould.    ** be a
a940: 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65  ble to even acce
a950: 73 73 20 74 68 65 20 68 65 61 70 2e 20 20 41 74  ss the heap.  At
a960: 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79  tempt to destroy
a970: 20 61 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75   and recreate ou
a980: 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65  r.    ** isolate
a990: 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  d Win32 native h
a9a0: 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  eap now..    */.
a9b0: 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d      assert( winM
a9c0: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
a9d0: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
a9e0: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
a9f0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
aa00: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
aa10: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
aa20: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
aa30: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
aa40: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
aa50: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
aa60: 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73  ==NULL );.    as
aa70: 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74  sert( !winMemGet
aa80: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
aa90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
aaa0: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
aab0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d  );.    rc = winM
aac0: 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74  emInit(winMemGet
aad0: 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20  DataPtr());.    
aae0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
aaf0: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
ab00: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
ab10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
ab20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77  !=SQLITE_OK || w
ab30: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
ab40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
ab50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
ab60: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
ab70: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65  sed()==0 );.  }e
ab80: 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse{.    /*.    
ab90: 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74  ** The Win32 nat
aba0: 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20  ive heap cannot 
abb0: 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61  be modified beca
abc0: 75 73 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e  use it may be in
abd0: 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   use..    */.   
abe0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
abf0: 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
ac00: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65  _mutex_leave(pMe
ac10: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  m);.  sqlite3_mu
ac20: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
ac30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
ac40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ac50: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
ac60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
ac70: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
ac80: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
ac90: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
aca0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
acb0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
acc0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
acd0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
ace0: 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63  te_debug(const c
acf0: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
ad00: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62  Buf){.  char zDb
ad10: 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33  gBuf[SQLITE_WIN3
ad20: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b  2_DBG_BUF_SIZE];
ad30: 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
ad40: 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f  N(nBuf, (SQLITE_
ad50: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
ad60: 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79  ZE - 1)); /* may
ad70: 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f   be negative. */
ad80: 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29  .  if( nMin<-1 )
ad90: 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61   nMin = -1; /* a
ada0: 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  ll negative valu
adb0: 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f  es become -1. */
adc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d  .  assert( nMin=
add0: 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c  =-1 || nMin==0 |
ade0: 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49  | nMin<SQLITE_WI
adf0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
ae00: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
ae10: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
ae20: 4f 52 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29  OR.  if( !zBuf )
ae30: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
ae40: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
ae50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ae60: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
ae70: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
ae80: 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20  HAS_ANSI).  if( 
ae90: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
aea0: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
aeb0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
aec0: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
aed0: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
aee0: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
aef0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
af00: 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b  tringA(zDbgBuf);
af10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73  .  }else{.    os
af20: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
af30: 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  gA(zBuf);.  }.#e
af40: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
af50: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
af60: 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  E).  memset(zDbg
af70: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
af80: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
af90: 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c  E);.  if ( osMul
afa0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
afb0: 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72  (.          osAr
afc0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
afd0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
afe0: 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20  MCP, 0, zBuf,.  
aff0: 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c          nMin, (L
b000: 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53  PWSTR)zDbgBuf, S
b010: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
b020: 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28  BUF_SIZE/sizeof(
b030: 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20  WCHAR))<=0 ){.  
b040: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b050: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
b060: 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44  ingW((LPCWSTR)zD
b070: 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20  bgBuf);.#else.  
b080: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
b090: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
b0a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
b0b0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
b0c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
b0d0: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
b0e0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
b0f0: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67  derr, "%s", zDbg
b100: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
b110: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
b120: 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  r, "%s", zBuf);.
b130: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
b140: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
b150: 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e  g routine suspen
b160: 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ds the current t
b170: 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61  hread for at lea
b180: 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65  st ms.** millise
b190: 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20  conds.  This is 
b1a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
b1b0: 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20  e Win32 Sleep() 
b1c0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
b1d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b1e0: 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20  T.static HANDLE 
b1f0: 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
b200: 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71  .#endif..void sq
b210: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
b220: 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63  p(DWORD millisec
b230: 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54  onds){.#if SQLIT
b240: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20  E_OS_WINRT.  if 
b250: 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c  ( sleepObj==NULL
b260: 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a   ){.    sleepObj
b270: 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74   = osCreateEvent
b280: 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ExW(NULL, NULL, 
b290: 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e  CREATE_EVENT_MAN
b2a0: 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20  UAL_RESET,.     
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48             SYNCH
b2d0: 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61  RONIZE);.  }.  a
b2e0: 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21  ssert( sleepObj!
b2f0: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69  =NULL );.  osWai
b300: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
b310: 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c  Ex(sleepObj, mil
b320: 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45  liseconds, FALSE
b330: 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65  );.#else.  osSle
b340: 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  ep(milliseconds)
b350: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
b360: 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
b370: 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21  R_THREADS>0 && !
b380: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
b390: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
b3a0: 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20  NRT && \.       
b3b0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
b3c0: 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74  FE>0.DWORD sqlit
b3d0: 65 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44  e3Win32Wait(HAND
b3e0: 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44  LE hObject){.  D
b3f0: 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65  WORD rc;.  while
b400: 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f  ( (rc = osWaitFo
b410: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
b420: 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54  hObject, INFINIT
b430: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29            TRUE))
b460: 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45  ==WAIT_IO_COMPLE
b470: 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72  TION ){}.  retur
b480: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
b490: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b4a0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
b4b0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
b4c0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
b4d0: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
b4e0: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
b4f0: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
b500: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
b510: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
b520: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
b530: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
b540: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
b550: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
b560: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
b570: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
b580: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
b590: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
b5a0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
b5b0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
b5c0: 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20  't call it when 
b5d0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
b5e0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
b5f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
b600: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
b610: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
b620: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
b630: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
b640: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
b650: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
b660: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
b670: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
b680: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b690: 2e 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54  ..*/..#if !SQLIT
b6a0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
b6b0: 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73  ONEX.# define os
b6c0: 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  IsNT()  (1).#eli
b6d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
b6e0: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
b6f0: 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64  INRT || !defined
b700: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
b710: 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65  S_ANSI).# define
b720: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
b730: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  elif !defined(SQ
b740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
b750: 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  IDE).# define os
b760: 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73  IsNT()  (0).#els
b770: 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  e.# define osIsN
b780: 54 28 29 20 20 28 28 73 71 6c 69 74 65 33 5f 6f  T()  ((sqlite3_o
b790: 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71  s_type==2) || sq
b7a0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e  lite3_win32_is_n
b7b0: 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t()).#endif../*.
b7c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b7d0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 74   determines if t
b7e0: 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 72 75  he machine is ru
b7f0: 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20  nning a version 
b800: 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61  of Windows.** ba
b810: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
b820: 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnel..*/.int sql
b830: 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74  ite3_win32_is_nt
b840: 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49  (void){.#if SQLI
b850: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 2f 2a  TE_OS_WINRT.  /*
b860: 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68 65 20  .  ** NOTE: The 
b870: 57 69 6e 52 54 20 73 75 62 2d 70 6c 61 74 66 6f  WinRT sub-platfo
b880: 72 6d 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  rm is always ass
b890: 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64  umed to be based
b8a0: 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a 2a 20   on the NT.  ** 
b8b0: 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a 20 20        kernel..  
b8c0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  */.  return 1;.#
b8d0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  elif SQLITE_WIN3
b8e0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20  2_GETVERSIONEX. 
b8f0: 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f 63 6b   if( osInterlock
b900: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
b910: 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  e(&sqlite3_os_ty
b920: 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  pe, 0, 0)==0 ){.
b930: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
b940: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
b950: 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  I).    OSVERSION
b960: 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOA sInfo;.   
b970: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
b980: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
b990: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
b9a0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28  osGetVersionExA(
b9b0: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49  &sInfo);.    osI
b9c0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
b9d0: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
b9e0: 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20  e3_os_type,.    
b9f0: 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61      (sInfo.dwPla
ba00: 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50  tformId == VER_P
ba10: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
ba20: 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23  ) ? 2 : 1, 0);.#
ba30: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
ba40: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
ba50: 44 45 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f  DE).    OSVERSIO
ba60: 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20  NINFOW sInfo;.  
ba70: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
ba80: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
ba90: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
baa0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57   osGetVersionExW
bab0: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73  (&sInfo);.    os
bac0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bad0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bae0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20  te3_os_type,.   
baf0: 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c       (sInfo.dwPl
bb00: 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f  atformId == VER_
bb10: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
bb20: 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a  T) ? 2 : 1, 0);.
bb30: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
bb40: 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  urn osInterlocke
bb50: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
bb60: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
bb70: 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c  e, 2, 2)==2;.#el
bb80: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
bb90: 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c   return osInterl
bba0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
bbb0: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
bbc0: 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b  _type, 2, 2)==2;
bbd0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a  .#else.  /*.  **
bbe0: 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62 2d 70   NOTE: All sub-p
bbf0: 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20 74  latforms where t
bc00: 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b  he GetVersionEx[
bc10: 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  AW] functions ar
bc20: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 64 65 70  e.  **       dep
bc30: 72 65 63 61 74 65 64 20 61 72 65 20 61 6c 77 61  recated are alwa
bc40: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
bc50: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
bc60: 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20   kernel..  */.  
bc70: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
bc80: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
bc90: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f  E_WIN32_MALLOC./
bca0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
bcb0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a  ytes of memory..
bcc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
bcd0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
bce0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
bcf0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
bd00: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
bd10: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
bd20: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
bd30: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
bd40: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
bd50: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
bd60: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
bd70: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
bd80: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
bd90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
bda0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
bdb0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
bdc0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
bdd0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
bde0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
bdf0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
be00: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
be10: 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61  0 );.  p = osHea
be20: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
be30: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
be40: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
be50: 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70  Bytes);.  if( !p
be60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
be70: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
be80: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
be90: 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20  pAlloc %u bytes 
bea0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
beb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bec0: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
bed0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
bee0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
bef0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
bf00: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a  ** Free memory..
bf10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
bf20: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
bf30: 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c  pPrior){.  HANDL
bf40: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
bf50: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
bf60: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
bf70: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
bf80: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
bf90: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bfa0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
bfb0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
bfc0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
bfd0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
bfe0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
bff0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c000: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c010: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
c020: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c030: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
c040: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
c050: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
c060: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
c070: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
c080: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
c090: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
c0a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c0b0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
c0c0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
c0d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c0e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
c0f0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
c100: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
c110: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c120: 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c    pPrior, osGetL
c130: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
c140: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d  d*)hHeap);.  }.}
c150: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c160: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
c170: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
c180: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
c190: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
c1a0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
c1b0: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
c1c0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
c1d0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
c1e0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
c1f0: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
c200: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
c210: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
c220: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c230: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
c240: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
c250: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c260: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
c270: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
c280: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
c290: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
c2a0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
c2b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
c2c0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
c2d0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
c2e0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
c2f0: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
c300: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
c310: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
c320: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c330: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
c340: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
c350: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
c360: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
c370: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c380: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
c390: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
c3a0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
c3b0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c3c0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
c3d0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
c3e0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
c3f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
c400: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
c410: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
c420: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
c430: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c440: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c450: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
c460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c480: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
c490: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
c4a0: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
c4b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
c4c0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
c4d0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
c4e0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
c4f0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
c500: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
c510: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
c520: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
c530: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
c540: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
c550: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
c560: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
c570: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
c580: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
c590: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
c5a0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
c5b0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
c5c0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c5d0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b  EAP_FLAGS, p) );
c5e0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
c5f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
c600: 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48   = osHeapSize(hH
c610: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c620: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
c630: 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45  ;.  if( n==(SIZE
c640: 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c  _T)-1 ){.    sql
c650: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c660: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
c670: 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b  o HeapSize block
c680: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
c690: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
c6a0: 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73       p, osGetLas
c6b0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
c6c0: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74  )hHeap);.    ret
c6d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
c6e0: 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f  urn (int)n;.}../
c6f0: 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20  *.** Round up a 
c700: 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20  request size to 
c710: 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61  the next valid a
c720: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a  llocation size..
c730: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
c740: 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20  nMemRoundup(int 
c750: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  n){.  return n;.
c760: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
c770: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
c780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c790: 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  inMemInit(void *
c7a0: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
c7b0: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
c7c0: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
c7d0: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
c7e0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
c7f0: 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ta ) return SQLI
c800: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65  TE_ERROR;.  asse
c810: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c820: 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f  >magic1==WINMEM_
c830: 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65  MAGIC1 );.  asse
c840: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c850: 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f  >magic2==WINMEM_
c860: 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21  MAGIC2 );..#if !
c870: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c880: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
c890: 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66  HEAP_CREATE.  if
c8a0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
c8b0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f  hHeap ){.    DWO
c8c0: 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  RD dwInitialSize
c8d0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
c8e0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a  HEAP_INIT_SIZE;.
c8f0: 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69      DWORD dwMaxi
c900: 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44  mumSize = (DWORD
c910: 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  )sqlite3GlobalCo
c920: 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20  nfig.nHeap;.    
c930: 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  if( dwMaximumSiz
c940: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77  e==0 ){.      dw
c950: 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51  MaximumSize = SQ
c960: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c970: 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65  MAX_SIZE;.    }e
c980: 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74 69 61  lse if( dwInitia
c990: 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53  lSize>dwMaximumS
c9a0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49  ize ){.      dwI
c9b0: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d  nitialSize = dwM
c9c0: 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20  aximumSize;.    
c9d0: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
c9e0: 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61  a->hHeap = osHea
c9f0: 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57  pCreate(SQLITE_W
ca00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ca10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c         dwInitial
ca40: 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53  Size, dwMaximumS
ca50: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
ca60: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
ca70: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
ca80: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
ca90: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22  MEM,.          "
caa0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72  failed to HeapCr
cab0: 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67  eate (%lu), flag
cac0: 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25  s=%u, initSize=%
cad0: 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22  lu, maxSize=%lu"
cae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  ,.          osGe
caf0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51  tLastError(), SQ
cb00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
cb10: 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c  FLAGS, dwInitial
cb20: 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
cb30: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
cb40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
cb50: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
cb60: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
cb70: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
cb80: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74  TRUE;.    assert
cb90: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
cba0: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c  Owned );.  }.#el
cbb0: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  se.  pWinMemData
cbc0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50  ->hHeap = osGetP
cbd0: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20  rocessHeap();.  
cbe0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
cbf0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73  ->hHeap ){.    s
cc00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
cc10: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
cc20: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50   "failed to GetP
cc30: 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29  rocessHeap (%lu)
cc40: 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ", osGetLastErro
cc50: 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r());.    return
cc60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
cc70: 50 54 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65  PT;.  }.  pWinMe
cc80: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
cc90: 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28  FALSE;.  assert(
cca0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62   !pWinMemData->b
ccb0: 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a  Owned );.#endif.
ccc0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
ccd0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20  mData->hHeap!=0 
cce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
ccf0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
cd00: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
cd10: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
cd20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
cd30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
cd40: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
cd50: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
cd60: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
cd70: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
cd80: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
cd90: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
cda0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  L) );.#endif.  r
cdb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cdc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74  .}../*.** Deinit
cdd0: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
cde0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
cdf0: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
ce00: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
ce10: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
ce20: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
ce30: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
ce40: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
ce50: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
ce60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
ce70: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
ce80: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
ce90: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
cea0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69  WinMemData->magi
ceb0: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
cec0: 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e  2 );..  if( pWin
ced0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
cee0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
cef0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cf00: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
cf10: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
cf20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
cf30: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
cf40: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
cf50: 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65  LIDATE).    asse
cf60: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
cf70: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
cf80: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
cf90: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
cfa0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
cfb0: 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44      if( pWinMemD
cfc0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20  ata->bOwned ){. 
cfd0: 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70       if( !osHeap
cfe0: 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44  Destroy(pWinMemD
cff0: 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20  ata->hHeap) ){. 
d000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
d010: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
d020: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
d030: 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68  Destroy (%lu), h
d040: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
d060: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
d070: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
d080: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
d090: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
d0a0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
d0b0: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
d0c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
d0d0: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
d0e0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
d0f0: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
d100: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d110: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
d120: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
d130: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
d140: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
d150: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
d160: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
d170: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
d180: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
d190: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
d1a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
d1b0: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
d1c0: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
d1d0: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
d1e0: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
d1f0: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
d200: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
d210: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
d220: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
d230: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
d240: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
d250: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d260: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
d270: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
d280: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
d290: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
d2a0: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
d2b0: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
d2c0: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
d2d0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
d2e0: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
d2f0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
d300: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
d310: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
d320: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
d330: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
d340: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
d350: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
d360: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
d370: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
d380: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
d390: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
d3a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
d3b0: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
d3c0: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
d3d0: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
d3e0: 74 20 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  t Unicode..**.**
d3f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d400: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d410: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d420: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d430: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
d440: 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f  LPWSTR winUtf8To
d450: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
d460: 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 69 6e  ar *zText){.  in
d470: 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
d480: 52 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a 20 20  R zWideText;..  
d490: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
d4a0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
d4b0: 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c  _UTF8, 0, zText,
d4c0: 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20   -1, NULL, 0);. 
d4d0: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
d4e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d4f0: 20 7d 0a 20 20 7a 57 69 64 65 54 65 78 74 20 3d   }.  zWideText =
d500: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
d510: 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  ro( nChar*sizeof
d520: 28 57 43 48 41 52 29 20 29 3b 0a 20 20 69 66 28  (WCHAR) );.  if(
d530: 20 7a 57 69 64 65 54 65 78 74 3d 3d 30 20 29 7b   zWideText==0 ){
d540: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d550: 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d   }.  nChar = osM
d560: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
d570: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
d580: 54 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64 65 54  Text, -1, zWideT
d590: 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
d5c0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
d5d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d5e0: 7a 57 69 64 65 54 65 78 74 29 3b 0a 20 20 20 20  zWideText);.    
d5f0: 7a 57 69 64 65 54 65 78 74 20 3d 20 30 3b 0a 20  zWideText = 0;. 
d600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64   }.  return zWid
d610: 65 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eText;.}../*.** 
d620: 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73  Convert a Micros
d630: 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69  oft Unicode stri
d640: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a  ng to UTF-8..**.
d650: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
d660: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
d670: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d680: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d690: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
d6a0: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
d6b0: 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52  deToUtf8(LPCWSTR
d6c0: 20 7a 57 69 64 65 54 65 78 74 29 7b 0a 20 20 69   zWideText){.  i
d6d0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
d6e0: 20 2a 7a 54 65 78 74 3b 0a 0a 20 20 6e 42 79 74   *zText;..  nByt
d6f0: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
d700: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
d710: 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c  8, 0, zWideText,
d720: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
d730: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
d740: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
d750: 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20   0;.  }.  zText 
d760: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
d770: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
d780: 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a  if( zText==0 ){.
d790: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d7a0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  }.  nByte = osWi
d7b0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
d7c0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
d7d0: 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65  ideText, -1, zTe
d7e0: 78 74 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  xt, nByte,.     
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
d810: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
d820: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
d830: 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20  3_free(zText);. 
d840: 20 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20     zText = 0;.  
d850: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74  }.  return zText
d860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d870: 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e  rt an ANSI strin
d880: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
d890: 6e 69 63 6f 64 65 2c 20 75 73 69 6e 67 20 74 68  nicode, using th
d8a0: 65 20 41 4e 53 49 20 6f 72 20 4f 45 4d 0a 2a 2a  e ANSI or OEM.**
d8b0: 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a   code page..**.*
d8c0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
d8d0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d8e0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d8f0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d900: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
d910: 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54   LPWSTR winMbcsT
d920: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
d930: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
d940: 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20  useAnsi){.  int 
d950: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
d960: 7a 4d 62 63 73 54 65 78 74 3b 0a 20 20 69 6e 74  zMbcsText;.  int
d970: 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73 65 41   codepage = useA
d980: 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  nsi ? CP_ACP : C
d990: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
d9a0: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
d9b0: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
d9c0: 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31  ge, 0, zText, -1
d9d0: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f          0)*sizeo
da00: 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20  f(WCHAR);.  if( 
da10: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
da20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
da30: 7a 4d 62 63 73 54 65 78 74 20 3d 20 73 71 6c 69  zMbcsText = sqli
da40: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
da50: 42 79 74 65 2a 73 69 7a 65 6f 66 28 57 43 48 41  Byte*sizeof(WCHA
da60: 52 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63  R) );.  if( zMbc
da70: 73 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sText==0 ){.    
da80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
da90: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
daa0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
dab0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74  depage, 0, zText
dac0: 2c 20 2d 31 2c 20 7a 4d 62 63 73 54 65 78 74 2c  , -1, zMbcsText,
dad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
db00: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
db10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
db20: 73 54 65 78 74 29 3b 0a 20 20 20 20 7a 4d 62 63  sText);.    zMbc
db30: 73 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sText = 0;.  }. 
db40: 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 54 65 78   return zMbcsTex
db50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  t;.}../*.** Conv
db60: 65 72 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20  ert a Microsoft 
db70: 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74  Unicode string t
db80: 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  o a multi-byte c
db90: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
dba0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 4e  .** using the AN
dbb0: 53 49 20 6f 72 20 4f 45 4d 20 63 6f 64 65 20 70  SI or OEM code p
dbc0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
dbd0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
dbe0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
dbf0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
dc00: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
dc10: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
dc20: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
dc30: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54 65  (LPCWSTR zWideTe
dc40: 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29  xt, int useAnsi)
dc50: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
dc60: 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20   char *zText;.  
dc70: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75  int codepage = u
dc80: 73 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20  seAnsi ? CP_ACP 
dc90: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
dca0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
dcb0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
dcc0: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54  epage, 0, zWideT
dcd0: 65 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ext, -1, 0, 0, 0
dce0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
dcf0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65  e == 0 ){.    re
dd00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54  turn 0;.  }.  zT
dd10: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ext = sqlite3Mal
dd20: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
dd30: 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30  ;.  if( zText==0
dd40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
dd50: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
dd60: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
dd70: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
dd80: 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31  0, zWideText, -1
dd90: 2c 20 7a 54 65 78 74 2c 0a 20 20 20 20 20 20 20  , zText,.       
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
ddc0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
ddd0: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
dde0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78  qlite3_free(zTex
ddf0: 74 29 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d 20  t);.    zText = 
de00: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
de10: 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zText;.}../*.** 
de20: 43 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74 69 2d  Convert a multi-
de30: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
de40: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a  tring to UTF-8..
de50: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
de60: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
de70: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
de80: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
de90: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
dea0: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 4d 62  atic char *winMb
deb0: 63 73 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 63  csToUtf8(const c
dec0: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
ded0: 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72  useAnsi){.  char
dee0: 20 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20 20 4c   *zTextUtf8;.  L
def0: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
df00: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69  .  zTmpWide = wi
df10: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a  nMbcsToUnicode(z
df20: 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a  Text, useAnsi);.
df30: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
df40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
df50: 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 55 74  0;.  }.  zTextUt
df60: 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  f8 = winUnicodeT
df70: 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b  oUtf8(zTmpWide);
df80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
df90: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
dfa0: 75 72 6e 20 7a 54 65 78 74 55 74 66 38 3b 0a 7d  urn zTextUtf8;.}
dfb0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
dfc0: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
dfd0: 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  o a multi-byte c
dfe0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e  haracter string.
dff0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
e000: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
e010: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
e020: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
e030: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
e040: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
e050: 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20  tf8ToMbcs(const 
e060: 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
e070: 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61   useAnsi){.  cha
e080: 72 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a 20 20  r *zTextMbcs;.  
e090: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
e0a0: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77  ..  zTmpWide = w
e0b0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
e0c0: 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20 7a 54  zText);.  if( zT
e0d0: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
e0e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
e0f0: 20 7a 54 65 78 74 4d 62 63 73 20 3d 20 77 69 6e   zTextMbcs = win
e100: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54  UnicodeToMbcs(zT
e110: 6d 70 57 69 64 65 2c 20 75 73 65 41 6e 73 69 29  mpWide, useAnsi)
e120: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
e130: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
e140: 74 75 72 6e 20 7a 54 65 78 74 4d 62 63 73 3b 0a  turn zTextMbcs;.
e150: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e160: 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65   a public wrappe
e170: 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66  r for the winUtf
e180: 38 54 6f 55 6e 69 63 6f 64 65 28 29 20 66 75 6e  8ToUnicode() fun
e190: 63 74 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53 54 52  ction..*/.LPWSTR
e1a0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
e1b0: 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63  tf8_to_unicode(c
e1c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
e1d0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e1e0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e1f0: 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29  R.  if( !zText )
e200: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
e210: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e220: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
e230: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
e240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e250: 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69  OINIT.  if( sqli
e260: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
e270: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
e280: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e  dif.  return win
e290: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 54  Utf8ToUnicode(zT
e2a0: 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ext);.}../*.** T
e2b0: 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20  his is a public 
e2c0: 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20  wrapper for the 
e2d0: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
e2e0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
e2f0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
e300: 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75  n32_unicode_to_u
e310: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
e320: 65 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53  eText){.#ifdef S
e330: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e340: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 57  _ARMOR.  if( !zW
e350: 69 64 65 54 65 78 74 20 29 7b 0a 20 20 20 20 28  ideText ){.    (
e360: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e370: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e380: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
e390: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e3a0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
e3b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
e3c0: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
e3d0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
e3e0: 65 74 75 72 6e 20 77 69 6e 55 6e 69 63 6f 64 65  eturn winUnicode
e3f0: 54 6f 55 74 66 38 28 7a 57 69 64 65 54 65 78 74  ToUtf8(zWideText
e400: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e410: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
e420: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
e430: 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e  MbcsToUtf8() fun
e440: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e450: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
e460: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
e470: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23   char *zText){.#
e480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e490: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e4a0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
e4b0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e4c0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e4d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
e4e0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e4f0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e500: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
e510: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
e520: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e530: 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73    return winMbcs
e540: 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 6f 73  ToUtf8(zText, os
e550: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
e560: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
e570: 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72  s is a public wr
e580: 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69  apper for the wi
e590: 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66 75  nMbcsToUtf8() fu
e5a0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
e5b0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
e5c0: 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63  bcs_to_utf8_v2(c
e5d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
e5e0: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
e5f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e600: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e610: 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20   if( !zText ){. 
e620: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
e630: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
e640: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
e650: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
e660: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
e670: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
e680: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
e690: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e6a0: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63  .  return winMbc
e6b0: 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 75  sToUtf8(zText, u
e6c0: 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  seAnsi);.}../*.*
e6d0: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
e6e0: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
e6f0: 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73  he winUtf8ToMbcs
e700: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
e710: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
e720: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
e730: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
e740: 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt){.#ifdef SQLI
e750: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e760: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
e770: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e780: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e790: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e7a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e7b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e7c0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e7d0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e7e0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e7f0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e800: 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65  inUtf8ToMbcs(zTe
e810: 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69  xt, osAreFileApi
e820: 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a  sANSI());.}../*.
e830: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62  ** This is a pub
e840: 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20  lic wrapper for 
e850: 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63  the winUtf8ToMbc
e860: 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  s() function..*/
e870: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
e880: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
e890: 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  s_v2(const char 
e8a0: 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41  *zText, int useA
e8b0: 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nsi){.#ifdef SQL
e8c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e8d0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78  RMOR.  if( !zTex
e8e0: 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  t ){.    (void)S
e8f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e900: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e910: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
e920: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e930: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
e940: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e950: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
e960: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e970: 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54  winUtf8ToMbcs(zT
e980: 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 7d  ext, useAnsi);.}
e990: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e9a0: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  ction is the sam
e9b0: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 77 69 6e  e as sqlite3_win
e9c0: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
e9d0: 20 28 62 65 6c 6f 77 29 3b 20 68 6f 77 65 76 65   (below); howeve
e9e0: 72 2c 0a 2a 2a 20 69 74 20 61 63 63 65 70 74 73  r,.** it accepts
e9f0: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e   a UTF-8 string.
ea00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
ea10: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
ea20: 6f 72 79 38 28 0a 20 20 75 6e 73 69 67 6e 65 64  ory8(.  unsigned
ea30: 20 6c 6f 6e 67 20 74 79 70 65 2c 20 2f 2a 20 49   long type, /* I
ea40: 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 64 69  dentifier for di
ea50: 72 65 63 74 6f 72 79 20 62 65 69 6e 67 20 73 65  rectory being se
ea60: 74 20 6f 72 20 72 65 73 65 74 20 2a 2f 0a 20 20  t or reset */.  
ea70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
ea80: 75 65 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65  ue  /* New value
ea90: 20 66 6f 72 20 64 69 72 65 63 74 6f 72 79 20 62   for directory b
eaa0: 65 69 6e 67 20 73 65 74 20 6f 72 20 72 65 73 65  eing set or rese
eab0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
eac0: 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30  *ppDirectory = 0
ead0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
eae0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
eaf0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
eb00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
eb10: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
eb20: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69  n rc;.#endif.  i
eb30: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
eb40: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
eb50: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
eb60: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
eb70: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
eb80: 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20  ectory;.  }else 
eb90: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
eba0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
ebb0: 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20  CTORY_TYPE ){.  
ebc0: 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20    ppDirectory = 
ebd0: 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  &sqlite3_temp_di
ebe0: 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61  rectory;.  }.  a
ebf0: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74  ssert( !ppDirect
ec00: 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c  ory || type==SQL
ec10: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
ec20: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20  IRECTORY_TYPE.  
ec30: 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d          || type=
ec40: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
ec50: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
ec60: 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  E.  );.  assert(
ec70: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
ec80: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
ec90: 48 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63  HasType(*ppDirec
eca0: 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45  tory, MEMTYPE_HE
ecb0: 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44  AP) );.  if( ppD
ecc0: 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
ecd0: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b  char *zCopy = 0;
ece0: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
ecf0: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
ed00: 20 20 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71        zCopy = sq
ed10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
ed20: 73 22 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20  s", zValue);.   
ed30: 20 20 20 69 66 20 28 20 7a 43 6f 70 79 3d 3d 30     if ( zCopy==0
ed40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ed50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
ed60: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
ed70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ed80: 66 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72  free(*ppDirector
ed90: 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63  y);.    *ppDirec
eda0: 74 6f 72 79 20 3d 20 7a 43 6f 70 79 3b 0a 20 20  tory = zCopy;.  
edb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
edc0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
edd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
ede0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
edf0: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  ction is the sam
ee00: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 77 69 6e  e as sqlite3_win
ee10: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
ee20: 20 28 62 65 6c 6f 77 29 3b 20 68 6f 77 65 76 65   (below); howeve
ee30: 72 2c 0a 2a 2a 20 69 74 20 61 63 63 65 70 74 73  r,.** it accepts
ee40: 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67   a UTF-16 string
ee50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ee60: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
ee70: 74 6f 72 79 31 36 28 0a 20 20 75 6e 73 69 67 6e  tory16(.  unsign
ee80: 65 64 20 6c 6f 6e 67 20 74 79 70 65 2c 20 2f 2a  ed long type, /*
ee90: 20 49 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   Identifier for 
eea0: 64 69 72 65 63 74 6f 72 79 20 62 65 69 6e 67 20  directory being 
eeb0: 73 65 74 20 6f 72 20 72 65 73 65 74 20 2a 2f 0a  set or reset */.
eec0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 56    const void *zV
eed0: 61 6c 75 65 20 20 2f 2a 20 4e 65 77 20 76 61 6c  alue  /* New val
eee0: 75 65 20 66 6f 72 20 64 69 72 65 63 74 6f 72 79  ue for directory
eef0: 20 62 65 69 6e 67 20 73 65 74 20 6f 72 20 72 65   being set or re
ef00: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
ef10: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 55 74 66  rc;.  char *zUtf
ef20: 38 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 56 61  8 = 0;.  if( zVa
ef30: 6c 75 65 20 29 7b 0a 20 20 20 20 7a 55 74 66 38  lue ){.    zUtf8
ef40: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
ef50: 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38  _unicode_to_utf8
ef60: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 69 66  (zValue);.    if
ef70: 28 20 7a 55 74 66 38 3d 3d 30 20 29 20 72 65 74  ( zUtf8==0 ) ret
ef80: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ef90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
efa0: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
efb0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 38 28 74  set_directory8(t
efc0: 79 70 65 2c 20 7a 55 74 66 38 29 3b 0a 20 20 69  ype, zUtf8);.  i
efd0: 66 28 20 7a 55 74 66 38 20 29 20 73 71 6c 69 74  f( zUtf8 ) sqlit
efe0: 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
eff0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f010: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74  ion sets the dat
f020: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74  a directory or t
f030: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
f040: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a  ectory based on.
f050: 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ** the provided 
f060: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
f070: 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75  type argument mu
f080: 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72  st be 1 in order
f090: 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64   to set the.** d
f0a0: 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72  ata directory or
f0b0: 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   2 in order to s
f0c0: 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  et the temporary
f0d0: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65   directory.  The
f0e0: 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d   zValue.** argum
f0f0: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
f100: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
f110: 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65   to use.  The re
f120: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20  turn value will 
f130: 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  be.** SQLITE_OK 
f140: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
f150: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
f160: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
f170: 79 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  y(.  unsigned lo
f180: 6e 67 20 74 79 70 65 2c 20 2f 2a 20 49 64 65 6e  ng type, /* Iden
f190: 74 69 66 69 65 72 20 66 6f 72 20 64 69 72 65 63  tifier for direc
f1a0: 74 6f 72 79 20 62 65 69 6e 67 20 73 65 74 20 6f  tory being set o
f1b0: 72 20 72 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69  r reset */.  voi
f1c0: 64 20 2a 7a 56 61 6c 75 65 20 20 20 20 20 20 20  d *zValue       
f1d0: 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f   /* New value fo
f1e0: 72 20 64 69 72 65 63 74 6f 72 79 20 62 65 69 6e  r directory bein
f1f0: 67 20 73 65 74 20 6f 72 20 72 65 73 65 74 20 2a  g set or reset *
f200: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  /.){.  return sq
f210: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
f220: 64 69 72 65 63 74 6f 72 79 31 36 28 74 79 70 65  directory16(type
f230: 2c 20 7a 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a  , zValue);.}../*
f240: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
f250: 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61  alue of winGetLa
f260: 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73  stErrorMsg.** is
f270: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
f280: 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
f290: 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
f2a0: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
f2b0: 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
f2c0: 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
f2d0: 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  cated)..*/.stati
f2e0: 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
f2f0: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
f300: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
f310: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
f320: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
f330: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
f340: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
f350: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
f360: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
f370: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
f380: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
f390: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
f3a0: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
f3b0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
f3c0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
f3d0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
f3e0: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
f3f0: 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
f400: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
f410: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
f420: 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49  mpWide[SQLITE_WI
f430: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
f440: 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c  HARS+1];.    dwL
f450: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
f460: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
f470: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
f480: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
f4b0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
f4e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
f500: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65         zTempWide
f550: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
f570: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
f580: 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20  ERRMSG_CHARS,.  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
f5b0: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
f5c0: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
f5d0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
f5e0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
f5f0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
f600: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
f630: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
f640: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
f670: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
f680: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
f6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
f710: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
f720: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
f770: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
f780: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
f790: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
f7a0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
f7b0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
f7c0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
f7d0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
f7e0: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
f7f0: 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  8(zTempWide);.  
f800: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
f810: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69  nignMalloc();.#i
f820: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
f830: 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  RT.      /* free
f840: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
f850: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
f860: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
f870: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
f880: 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23  ee(zTempWide);.#
f890: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
f8a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
f8b0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
f8c0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
f8d0: 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Temp = NULL;.   
f8e0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
f8f0: 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54  tMessageA(FORMAT
f900: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
f910: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
f940: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
f950: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
f980: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
f990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
f9b0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29           (LPSTR)
fa20: 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20   &zTemp,.       
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
fa70: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
fa80: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
fa90: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
faa0: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
fab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
fac0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
fad0: 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  );.      zOut = 
fae0: 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54  winMbcsToUtf8(zT
faf0: 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  emp, osAreFileAp
fb00: 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 20  isANSI());.     
fb10: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
fb20: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
fb30: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
fb40: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
fb50: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
fb60: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
fb70: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
fb80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
fb90: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
fba0: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
fbb0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
fbc0: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
fbd0: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
fbe0: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
fbf0: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
fc00: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
fc10: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
fc20: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
fc30: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
fc40: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
fc50: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
fc60: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
fc70: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
fc80: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
fc90: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
fca0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
fcb0: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
fcc0: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
fcd0: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
fce0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
fcf0: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
fd00: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
fd10: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
fd20: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
fd30: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
fd40: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
fd50: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
fd60: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
fd70: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
fd80: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
fd90: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
fda0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
fdb0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
fdc0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
fdd0: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
fde0: 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d   from.** FormatM
fdf0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
fe00: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
fe10: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
fe20: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
fe30: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
fe40: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
fe50: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
fe60: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
fe70: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
fe80: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a  TE_CANTOPEN)..**
fe90: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
fea0: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
feb0: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
fec0: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
fed0: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
fee0: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
fef0: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
ff00: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
ff10: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
ff20: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
ff30: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
ff40: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
ff50: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
ff60: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
ff70: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
ff80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
ff90: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
ffa0: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
ffb0: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
ffe0: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
fff0: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
10000 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10010 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
10020 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
10030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
10040 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
10050 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
10060 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
10070 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
10080 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
10090 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
100a0 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
100b0 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
100c0 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
100d0 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
100e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
100f0 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
10100 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
10110 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10130 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10140 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
10150 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
10160 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
10170 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
10180 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
10190 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
101a0 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
101b0 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
101c0 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
101d0 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
101e0 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
101f0 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
10200 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
10210 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
10220 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
10230 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
10240 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
10250 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
10260 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
10270 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
10280 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
10290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
102a0 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
102b0 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
102c0 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
102d0 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
102e0 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
102f0 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
10300 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
10310 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
10320 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
10330 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
10340 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
10350 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10360 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
10370 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
10380 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
10390 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
103a0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
103b0 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
103c0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
103d0 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
103e0 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
103f0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
10400 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
10410 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
10420 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
10430 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
10440 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
10450 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
10460 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
10470 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
10480 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
10490 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
104a0 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
104b0 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  DELAY;../*.** Th
104c0 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
104d0 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75  try1" macro is u
104e0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
104f0 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
10500 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   I/O.** error co
10510 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  de obtained via 
10520 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69  GetLastError() i
10530 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  s eligible to be
10540 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a   retried.  It.**
10550 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65   must accept the
10560 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52   error code DWOR
10570 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72  D as its only ar
10580 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c  gument and shoul
10590 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
105a0 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
105b0 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69  r code is transi
105c0 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e  ent in nature an
105d0 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  d the operation.
105e0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
105f0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
10600 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72  e original error
10610 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75   might succeed u
10620 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74  pon being.** ret
10630 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d  ried.  The argum
10640 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
10650 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61  o should be a va
10660 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64  riable..**.** Ad
10670 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61  ditionally, a ma
10680 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f  cro named "winIo
10690 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
106a0 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49  y be defined.  I
106b0 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  f it.** is defin
106c0 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ed, it will be c
106d0 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68  onsulted only wh
106e0 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69  en the macro "wi
106f0 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
10700 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  .** returns zero
10710 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  .  The "winIoerr
10720 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
10730 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f   is completely o
10740 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d  ptional and.** m
10750 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e  ay be used to in
10760 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c  clude additional
10770 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20   error codes in 
10780 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f  the set that sho
10790 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  uld.** result in
107a0 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f   the failing I/O
107b0 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67   operation being
107c0 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20   retried by the 
107d0 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64  caller.  If.** d
107e0 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e  efined, the "win
107f0 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
10800 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62  macro must exhib
10810 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
10820 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63  ntics.** identic
10830 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74  al to those of t
10840 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
10850 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f  etry1" macro..*/
10860 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69  .#if !defined(wi
10870 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29  nIoerrCanRetry1)
10880 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72  .#define winIoer
10890 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28  rCanRetry1(a) ((
108a0 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53  (a)==ERROR_ACCES
108b0 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20  S_DENIED)       
108c0 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
108f0 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
10900 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20  N)    || \.     
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
10930 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
10940 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ION)       || \.
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
10970 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f  a)==ERROR_DEV_NO
10980 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20  T_EXIST)        
10990 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
109c0 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20  ETNAME_DELETED) 
109d0 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
10a00 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
10a10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
10a40 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b  )==ERROR_NETWORK
10a50 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23  _UNREACHABLE)).#
10a60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
10a70 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
10a80 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
10a90 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
10aa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10ab0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
10ac0 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
10ad0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
10ae0 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
10af0 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
10b00 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
10b10 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10b20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
10b30 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
10b40 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
10b50 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
10b60 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
10b70 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
10b80 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
10b90 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
10ba0 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
10bb0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10bc0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
10bd0 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
10be0 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
10bf0 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
10c00 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
10c10 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
10c20 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
10c30 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10c40 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77   }.#if defined(w
10c50 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
10c60 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e  ).  else if( win
10c70 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65  IoerrCanRetry2(e
10c80 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
10c90 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
10ca0 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
10cb0 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
10cc0 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
10cd0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10ce0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
10cf0 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
10d00 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
10d10 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
10d20 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
10d30 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
10d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10d50 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
10d60 6e 52 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65  nRetry, int line
10d70 6e 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  no){.  if( nRetr
10d80 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
10d90 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
10da0 43 45 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79  CE,.      "delay
10db0 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
10dc0 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
10dd0 74 20 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20  t at line %d",. 
10de0 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
10df0 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28  ryDelay*nRetry*(
10e00 6e 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e  nRetry+1)/2, lin
10e10 65 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  eno.    );.  }.}
10e20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 23 69 66  ../*.** This #if
10e30 20 64 6f 65 73 20 6e 6f 74 20 72 65 6c 79 20 6f   does not rely o
10e40 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 53 5f  n the SQLITE_OS_
10e50 57 49 4e 43 45 20 64 65 66 69 6e 65 20 62 65 63  WINCE define bec
10e60 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ause the.** corr
10e70 65 73 70 6f 6e 64 69 6e 67 20 73 65 63 74 69 6f  esponding sectio
10e80 6e 20 69 6e 20 22 64 61 74 65 2e 63 22 20 63 61  n in "date.c" ca
10e90 6e 6e 6f 74 20 75 73 65 20 69 74 2e 0a 2a 2f 0a  nnot use it..*/.
10ea0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10eb0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49  ITE_OMIT_LOCALTI
10ec0 4d 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  ME) && defined(_
10ed0 57 49 4e 33 32 5f 57 43 45 29 20 26 26 20 5c 0a  WIN32_WCE) && \.
10ee0 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
10ef0 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
10f00 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c  IME_API) || !SQL
10f10 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
10f20 4d 45 5f 41 50 49 29 0a 2f 2a 0a 2a 2a 20 54 68  ME_API)./*.** Th
10f30 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
10f40 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
10f50 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
10f60 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  e() function..**
10f70 20 53 6f 20 64 65 66 69 6e 65 20 61 20 73 75 62   So define a sub
10f80 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 20 20 69  stitute..*/.#  i
10f90 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
10fa0 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
10fb0 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
10fc0 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
10fd0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
10fe0 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
10ff0 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
11000 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
11010 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
11020 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
11030 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
11040 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
11050 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
11060 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
11070 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
11080 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
11090 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
110a0 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
110b0 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
110c0 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
110d0 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
110e0 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
110f0 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
11100 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
11110 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
11120 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
11130 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
11140 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
11150 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
11160 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
11170 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
11180 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
11190 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
111a0 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
111b0 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
111c0 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
111d0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
111e0 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _WINCE./********
111f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11230 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
11240 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
11250 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
11260 2a 2f 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  */.#define HANDL
11270 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
11280 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
11290 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
112a0 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
112b0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
112c0 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
112d0 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
112e0 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
112f0 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
11300 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
11310 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
11320 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
11330 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
11340 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
11350 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
11360 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
11370 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
11380 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
11390 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
113a0 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
113b0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
113c0 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
113d0 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
113e0 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
113f0 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
11400 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
11410 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
11420 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
11430 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
11440 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
11450 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63  .static int winc
11460 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
11470 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
11480 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
11490 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
114a0 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
114b0 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  e;.  DWORD lastE
114c0 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f  rrno;.  BOOL bLo
114d0 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  gged = FALSE;.  
114e0 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
114f0 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69  E;..  zName = wi
11500 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
11510 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
11520 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
11530 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
11540 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
11550 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
11560 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
11570 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11580 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61  e local lockdata
11590 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46   */.  memset(&pF
115a0 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73  ile->local, 0, s
115b0 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63  izeof(pFile->loc
115c0 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c  al));..  /* Repl
115d0 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73  ace the backslas
115e0 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  hes from the fil
115f0 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63  ename and lowerc
11600 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64  ase it.  ** to d
11610 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61  erive a mutex na
11620 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20  me. */.  zTok = 
11630 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61  osCharLowerW(zNa
11640 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54  me);.  for (;*zT
11650 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20  ok;zTok++){.    
11660 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c  if (*zTok == '\\
11670 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a  ') *zTok = '_';.
11680 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
11690 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20  /open the named 
116a0 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65  mutex */.  pFile
116b0 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65  ->hMutex = osCre
116c0 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20  ateMutexW(NULL, 
116d0 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20  FALSE, zName);. 
116e0 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
116f0 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  tex){.    pFile-
11700 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
11710 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
11720 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11730 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
11740 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
11750 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
11760 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
11790 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e  teLock1", zFilen
117a0 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ame);.  }..  /* 
117b0 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
117c0 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
117d0 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
117e0 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
117f0 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
11800 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
11810 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
11820 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
11830 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
11840 20 61 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73   are.  ** case-s
11850 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61  ensitive, take a
11860 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74  dvantage of that
11870 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20   by uppercasing 
11880 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20  the mutex name. 
11890 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68   ** and using th
118a0 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64  at as the shared
118b0 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d   filemapping nam
118c0 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72  e..  */.  osChar
118d0 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  UpperW(zName);. 
118e0 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
118f0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
11900 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48  ppingW(INVALID_H
11910 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c  ANDLE_VALUE, NUL
11920 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f             PAGE_
11950 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69  READWRITE, 0, si
11960 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c  zeof(winceLock),
11970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b           zName);
119a0 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
119b0 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
119c0 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
119d0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
119e0 65 6d 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a  emory so it.  **
119f0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
11a00 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
11a10 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
11a20 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
11a30 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
11a40 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
11a50 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
11a60 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
11a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
11a80 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
11a90 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
11aa0 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
11ab0 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
11ac0 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
11ad0 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
11ae0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
11af0 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
11b00 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
11b10 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
11b20 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
11b30 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
11b40 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
11b50 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
11b60 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
11b70 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
11b80 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
11b90 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
11ba0 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
11bb0 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d  .    if( !pFile-
11bc0 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  >shared ){.     
11bd0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11be0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
11bf0 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c  or();.      winL
11c00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11c10 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
11c20 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11c30 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
11c40 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46  CreateLock2", zF
11c50 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
11c60 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a  bLogged = TRUE;.
11c70 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
11c80 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
11c90 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed);.      pFile
11ca0 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c  ->hShared = NULL
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11cc0 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f  * If shared memo
11cd0 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ry could not be 
11ce0 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c  created, then cl
11cf0 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ose the mutex an
11d00 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20  d fail */.  if( 
11d10 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d  pFile->hShared==
11d20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
11d30 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20  !bLogged ){.    
11d40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11d50 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
11d60 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
11d70 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
11d80 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11da0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
11db0 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock3", zFilenam
11dc0 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
11dd0 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  d = TRUE;.    }.
11de0 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
11df0 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
11e00 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  tex);.    osClos
11e10 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
11e20 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
11e30 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
11e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11e50 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
11e60 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
11e70 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
11e80 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f  y if we're suppo
11e90 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20  sed to */.  if( 
11ea0 62 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d  bInit ){.    mem
11eb0 73 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  set(pFile->share
11ec0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  d, 0, sizeof(win
11ed0 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20  ceLock));.  }.. 
11ee0 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11ef0 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11f00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11f10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11f20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74  Destroy the part
11f30 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74   of winFile that
11f40 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63   deals with winc
11f50 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69  e locks.*/.stati
11f60 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74  c void winceDest
11f70 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  royLock(winFile 
11f80 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70  *pFile){.  if (p
11f90 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
11fa0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68     /* Acquire th
11fb0 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
11fc0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
11fd0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11fe0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
11ff0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68  lowing blocks sh
12000 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73  ould probably as
12010 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f  sert in debug mo
12020 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20  de, but they.   
12030 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e      are to clean
12040 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c  up in case any l
12050 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70  ocks remained op
12060 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  en */.    if (pF
12070 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
12080 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ers){.      pFil
12090 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
120a0 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ers --;.    }.  
120b0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
120c0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20  al.bReserved){. 
120d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
120e0 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
120f0 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
12100 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
12110 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
12120 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
12130 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
12140 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
12150 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
12160 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
12170 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
12180 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
12190 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LSE;.    }..    
121a0 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20  /* De-reference 
121b0 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f  and close our co
121c0 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  py of the shared
121d0 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a   memory handle *
121e0 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65  /.    osUnmapVie
121f0 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
12200 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c  hared);.    osCl
12210 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
12220 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
12230 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65  /* Done with the
12240 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
12250 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
12260 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12270 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
12280 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
12290 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
122a0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  tex = NULL;.  }.
122b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c  }../*.** An impl
122c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
122d0 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49  e LockFile() API
122e0 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
122f0 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
12300 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  L winceLockFile(
12310 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
12320 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
12330 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
12340 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12350 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
12360 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
12370 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
12380 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12390 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
123a0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
123b0 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
123c0 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
123d0 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
123e0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
123f0 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
12400 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
12410 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
12420 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
12430 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
12440 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
12450 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
12460 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
12470 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
12480 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
12490 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
124a0 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
124b0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
124c0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
124d0 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
124e0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
124f0 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
12500 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
12510 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
12520 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
12530 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
12540 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
12550 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
12560 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
12570 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
12580 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
12590 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
125a0 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
125b0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
125c0 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
125d0 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
125e0 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
125f0 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
12600 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
12610 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
12620 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
12630 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
12640 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
12650 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
12660 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
12670 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
12680 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
12690 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
126a0 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
126b0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
126c0 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
126d0 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
126e0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
126f0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
12700 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
12710 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
12720 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
12730 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
12740 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
12750 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
12760 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
12770 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
12780 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
12790 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
127a0 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
127b0 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
127c0 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
127d0 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
127e0 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
127f0 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
12800 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
12810 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
12820 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
12830 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
12840 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
12850 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
12860 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
12870 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
12880 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
12890 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
128a0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
128b0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
128c0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
128d0 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
128e0 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
128f0 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
12900 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
12910 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
12920 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
12930 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
12940 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
12950 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
12960 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
12970 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
12980 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
12990 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
129a0 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
129b0 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
129c0 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e  kFile API of Win
129d0 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
129e0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
129f0 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
12a00 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
12a10 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
12a20 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
12a30 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
12a40 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
12a50 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
12a60 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
12a70 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12a80 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
12a90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
12aa0 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
12ab0 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
12ac0 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
12ad0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
12ae0 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
12af0 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
12b00 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
12b10 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
12b20 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
12b30 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
12b40 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
12b50 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
12b60 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12b70 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
12b80 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72  a reader lock or
12b90 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
12ba0 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  ck */.  if (dwFi
12bb0 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
12bc0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
12bd0 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20  ST){.    /* Did 
12be0 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  we have an exclu
12bf0 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
12c00 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
12c10 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
12c20 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
12c30 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12c40 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
12c50 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20  )SHARED_SIZE);. 
12c60 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
12c70 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  l.bExclusive = F
12c80 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
12c90 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
12ca0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
12cb0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
12cc0 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RUE;.    }..    
12cd0 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68  /* Did we just h
12ce0 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ave a reader loc
12cf0 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  k? */.    else i
12d00 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
12d10 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
12d20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
12d30 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
12d40 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
12d50 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  ED_SIZE.        
12d60 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f       || nNumberO
12d70 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
12d80 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70  w == 1);.      p
12d90 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
12da0 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69  ders --;.      i
12db0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
12dc0 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20  nReaders == 0). 
12dd0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
12de0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
12df0 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
12e00 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
12e10 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
12e20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69   }..  /* Releasi
12e30 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  ng a pending loc
12e40 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
12e50 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
12e60 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
12e70 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
12e80 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
12e90 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
12ea0 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
12eb0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
12ec0 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
12ed0 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
12ee0 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
12ef0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
12f00 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
12f10 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
12f20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
12f30 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  }.  /* Releasing
12f40 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
12f50 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
12f60 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
12f70 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45  = (DWORD)RESERVE
12f80 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  D_BYTE.         
12f90 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
12fa0 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
12fb0 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
12fc0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
12fd0 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46  rved) {.      pF
12fe0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
12ff0 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
13000 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
13010 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
13020 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
13030 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
13040 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
13050 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
13060 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
13070 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f  urn bReturn;.}./
13080 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  *.** End of the 
13090 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72  special code for
130a0 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   wince.*********
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
13100 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
13110 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  */../*.** Lock a
13120 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f   file region..*/
13130 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
13140 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
13150 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
13160 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57  WORD flags,.  DW
13170 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20  ORD offsetLow,. 
13180 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67   DWORD offsetHig
13190 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  h,.  DWORD numBy
131a0 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  tesLow,.  DWORD 
131b0 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a  numBytesHigh.){.
131c0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
131d0 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  NCE.  /*.  ** NO
131e0 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
131f0 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
13200 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
13210 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
13220 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  in32.  **       
13230 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20  API LockFile..  
13240 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
13250 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  eLockFile(phFile
13260 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
13270 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
132a0 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
132b0 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  e.  if( osIsNT()
132c0 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
132d0 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d  ED ovlp;.    mem
132e0 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
132f0 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13300 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  );.    ovlp.Offs
13310 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a  et = offsetLow;.
13320 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48      ovlp.OffsetH
13330 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68  igh = offsetHigh
13340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  ;.    return osL
13350 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c  ockFileEx(*phFil
13360 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d  e, flags, 0, num
13370 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
13380 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
13390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
133a0 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a  urn osLockFile(*
133b0 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
133c0 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e  w, offsetHigh, n
133d0 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20  umBytesLow,.    
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
13400 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
13410 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69  *.** Unlock a fi
13420 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73  le region.. */.s
13430 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e  tatic BOOL winUn
13440 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
13450 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
13460 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a  WORD offsetLow,.
13470 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69    DWORD offsetHi
13480 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  gh,.  DWORD numB
13490 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  ytesLow,.  DWORD
134a0 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b   numBytesHigh.){
134b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
134c0 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INCE.  /*.  ** N
134d0 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
134e0 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
134f0 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
13500 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
13510 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20  Win32.  **      
13520 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e   API UnlockFile.
13530 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77  .  */.  return w
13540 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  inceUnlockFile(p
13550 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
13560 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  , offsetHigh,.  
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c         numBytesL
13590 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
135a0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f  );.#else.  if( o
135b0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f  sIsNT() ){.    O
135c0 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
135d0 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70      memset(&ovlp
135e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
135f0 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
13600 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73  lp.Offset = offs
13610 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e  etLow;.    ovlp.
13620 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66  OffsetHigh = off
13630 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74  setHigh;.    ret
13640 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
13650 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e  Ex(*phFile, 0, n
13660 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
13670 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
13680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13690 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
136a0 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
136b0 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
136c0 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
136f0 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
13700 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f.}../**********
13710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13750 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  ***.** The next 
13760 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
13770 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  s implement the 
13780 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63  I/O methods spec
13790 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ified.** by the 
137a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
137b0 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a  ds object..*****
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
13810 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
13820 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
13830 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
13840 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
13850 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
13860 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e  NTER.# define IN
13870 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
13880 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d  OINTER ((DWORD)-
13890 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  1).#endif../*.**
138a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e   Move the curren
138b0 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
138c0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61  e file handle pa
138d0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
138e0 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  t.** argument to
138f0 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20   offset iOffset 
13900 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e  within the file.
13910 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
13920 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68  return 0..** Oth
13930 65 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c  erwise, set pFil
13940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64  e->lastErrno and
13950 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
13960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13970 77 69 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46  winSeekFile(winF
13980 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
13990 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
139a0 74 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t){.#if !SQLITE_
139b0 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20  OS_WINRT.  LONG 
139c0 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20  upperBits;      
139d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
139e0 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
139f0 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
13a00 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
13a10 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
13a20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e     /* Least sig.
13a30 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20   32 bits of new 
13a40 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52  offset */.  DWOR
13a50 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20  D dwRet;        
13a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13a70 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
13a80 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
13a90 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  ) */.  DWORD las
13aa0 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
13ab0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
13ac0 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
13ad0 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20  astError() */.. 
13ae0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
13af0 66 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  file=%p, offset=
13b00 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
13b10 68 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20  h, iOffset));.. 
13b20 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
13b30 4e 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32  NG)((iOffset>>32
13b40 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
13b50 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28  .  lowerBits = (
13b60 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20  LONG)(iOffset & 
13b70 30 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20  0xffffffff);..  
13b80 2f 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49  /* API oddity: I
13b90 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65  f successful, Se
13ba0 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72  tFilePointer() r
13bb0 65 74 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20  eturns a dword. 
13bc0 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
13bd0 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73  he lower 32-bits
13be0 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
13bf0 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20  -offset. Or, if 
13c00 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69  it fails,.  ** i
13c10 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49  t returns INVALI
13c20 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
13c30 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f  ER. However acco
13c40 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20  rding to MSDN,. 
13c50 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f   ** INVALID_SET_
13c60 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79  FILE_POINTER may
13c70 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64   also be a valid
13c80 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20   new offset. So 
13c90 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a  to determine.  *
13ca0 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72  * whether an err
13cb0 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  or has actually 
13cc0 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20  occurred, it is 
13cd0 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74  also necessary t
13ce0 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c  o call.  ** GetL
13cf0 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f  astError()..  */
13d00 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74  .  dwRet = osSet
13d10 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
13d20 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
13d30 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
13d40 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
13d50 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44   (dwRet==INVALID
13d60 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
13d70 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  R.      && ((las
13d80 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13d90 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
13da0 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46  RROR)) ){.    pF
13db0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13dc0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13dd0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13de0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70  TE_IOERR_SEEK, p
13df0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13e10 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20   "winSeekFile", 
13e20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
13e30 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45     OSTRACE(("SEE
13e40 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
13e50 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c  LITE_IOERR_SEEK\
13e60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13e70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13e80 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
13e90 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
13ea0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
13eb0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
13ec0 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  rn 0;.#else.  /*
13ed0 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62  .  ** Same as ab
13ee0 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
13ef0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
13f00 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57  tion works for W
13f10 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41  inRT..  */..  LA
13f20 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20  RGE_INTEGER x;  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f40 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20   The new offset 
13f50 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20  */.  BOOL bRet; 
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13f80 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c  turned by SetFil
13f90 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a  ePointerEx() */.
13fa0 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20  .  x.QuadPart = 
13fb0 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20  iOffset;.  bRet 
13fc0 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  = osSetFilePoint
13fd0 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78  erEx(pFile->h, x
13fe0 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  , 0, FILE_BEGIN)
13ff0 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a  ;..  if(!bRet){.
14000 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14010 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14020 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
14030 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14040 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
14050 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14070 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69  inSeekFile", pFi
14080 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
14090 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
140a0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
140b0 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c  E_IOERR_SEEK\n",
140c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
140d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
140e0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
140f0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14100 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
14110 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
14120 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  0;.#endif.}..#if
14130 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
14140 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61  _SIZE>0./* Forwa
14150 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
14160 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68   VFS helper meth
14170 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ods used for mem
14180 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
14190 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
141a0 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  inMapfile(winFil
141b0 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  e*, sqlite3_int6
141c0 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  4);.static int w
141d0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46  inUnmapfile(winF
141e0 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ile*);.#endif../
141f0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
14200 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72  e..**.** It is r
14210 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20  eported that an 
14220 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65  attempt to close
14230 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20   a handle might 
14240 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69  sometimes.** fai
14250 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65  l.  This is a ve
14260 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ry unreasonable 
14270 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64  result, but Wind
14280 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73  ows is notorious
14290 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e  .** for being un
142a0 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20  reasonable so I 
142b0 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61  do not doubt tha
142c0 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65  t it might happe
142d0 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c  n.  If.** the cl
142e0 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61  ose fails, we pa
142f0 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c  use for 100 mill
14300 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
14310 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d   again.  As.** m
14320 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f  any as MX_CLOSE_
14330 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73  ATTEMPT attempts
14340 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61   to close the ha
14350 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65  ndle are made be
14360 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75  fore.** giving u
14370 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
14380 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65  an error..*/.#de
14390 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  fine MX_CLOSE_AT
143a0 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69  TEMPT 3.static i
143b0 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69  nt winClose(sqli
143c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
143d0 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30   int rc, cnt = 0
143e0 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
143f0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
14400 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  d;..  assert( id
14410 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  !=0 );.#ifndef S
14420 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
14430 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
14440 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  pShm==0 );.#endi
14450 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  f.  assert( pFil
14460 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46  e->h!=NULL && pF
14470 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f  ile->h!=INVALID_
14480 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
14490 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
144a0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
144b0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c  =%p, file=%p\n",
144c0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
144d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
144e0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
144f0 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
14500 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
14510 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69  E>0.  winUnmapfi
14520 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
14530 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  f..  do{.    rc 
14540 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
14550 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
14560 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
14570 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
14580 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
14590 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
145a0 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
145b0 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
145c0 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
145d0 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
145e0 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
145f0 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
14600 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
14610 41 54 54 45 4d 50 54 53 20 33 0a 20 20 7b 0a 20  ATTEMPTS 3.  {. 
14620 20 20 20 77 69 6e 56 66 73 41 70 70 44 61 74 61     winVfsAppData
14630 20 2a 70 41 70 70 44 61 74 61 20 3d 20 28 77 69   *pAppData = (wi
14640 6e 56 66 73 41 70 70 44 61 74 61 2a 29 70 46 69  nVfsAppData*)pFi
14650 6c 65 2d 3e 70 56 66 73 2d 3e 70 41 70 70 44 61  le->pVfs->pAppDa
14660 74 61 3b 0a 20 20 20 20 69 66 28 20 70 41 70 70  ta;.    if( pApp
14670 44 61 74 61 3d 3d 4e 55 4c 4c 20 7c 7c 20 21 70  Data==NULL || !p
14680 41 70 70 44 61 74 61 2d 3e 62 4e 6f 4c 6f 63 6b  AppData->bNoLock
14690 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 63 65 44   ){.      winceD
146a0 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
146b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
146c0 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  f( pFile->zDelet
146d0 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20  eOnClose ){.    
146e0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
146f0 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20   while(.        
14700 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57     osDeleteFileW
14710 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
14720 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20  nClose)==0.     
14730 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41     && osGetFileA
14740 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65  ttributesW(pFile
14750 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14760 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20  )!=0xffffffff.  
14770 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
14780 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
14790 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
147a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
147b0 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
147c0 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
147d0 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
147e0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
147f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14800 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
14810 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
14820 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
14830 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e      pFile->h = N
14840 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43  ULL;.  }.  OpenC
14850 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53  ounter(-1);.  OS
14860 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69  TRACE(("CLOSE pi
14870 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
14880 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
14890 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
148a0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
148b0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
148c0 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f  File->h, rc ? "o
148d0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
148e0 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
148f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
14900 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
14910 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14920 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
14930 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
14960 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
14970 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
14980 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
14990 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
149a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
149b0 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
149c0 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
149d0 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
149e0 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
149f0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
14a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14a10 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
14a20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
14a30 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
14a40 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
14a50 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
14a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
14a70 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
14a80 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
14a90 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14ab0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
14ac0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
14ad0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
14ae0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
14af0 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
14b00 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  offset */.){.#if
14b10 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
14b20 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
14b30 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
14b40 45 52 4c 41 50 50 45 44 29 0a 20 20 4f 56 45 52  ERLAPPED).  OVER
14b50 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65  LAPPED overlappe
14b60 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
14b70 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65  he offset for Re
14b80 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69  adFile. */.#endi
14b90 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  f.  winFile *pFi
14ba0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
14bb0 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64  d;  /* file hand
14bc0 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52  le */.  DWORD nR
14bd0 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
14be0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14bf0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
14c00 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69  lly read from fi
14c10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
14c20 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
14c30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14c40 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a  r of retrys */..
14c50 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
14c60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
14c70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
14c80 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53  offset>=0 );.  S
14c90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
14ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14cb0 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52  RR_READ);.  OSTR
14cc0 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
14cd0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
14ce0 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70  le=%p, buffer=%p
14cf0 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20  , amount=%d, ". 
14d00 20 20 20 20 20 20 20 20 20 20 22 6f 66 66 73 65            "offse
14d10 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c  t=%lld, lock=%d\
14d20 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
14d30 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14d40 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  le,.           p
14d50 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
14d60 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c  mt, offset, pFil
14d70 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
14d80 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
14d90 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
14da0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
14db0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
14dc0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
14dd0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
14de0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
14df0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
14e00 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
14e10 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
14e20 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
14e30 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
14e40 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
14e50 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
14e60 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
14e70 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
14e80 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
14e90 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
14ea0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
14eb0 52 45 41 44 2d 4d 4d 41 50 20 70 69 64 3d 25 6c  READ-MMAP pid=%l
14ec0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
14ed0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14ee0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
14ef0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
14f00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14f10 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
14f20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
14f30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
14f40 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
14f50 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69  Copy = (int)(pFi
14f60 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
14f70 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65  ffset);.      me
14f80 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
14f90 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
14fa0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
14fb0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
14fc0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
14fd0 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
14fe0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
14ff0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
15000 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
15010 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
15020 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
15030 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
15040 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
15050 45 44 29 0a 20 20 69 66 28 20 77 69 6e 53 65 65  ED).  if( winSee
15060 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
15070 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52  set) ){.    OSTR
15080 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
15090 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
150a0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
150b0 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20  _FULL\n",.      
150c0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
150d0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
150e0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
150f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15100 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
15110 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
15120 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
15130 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
15140 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d   0) ){.#else.  m
15150 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
15160 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
15170 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65  RLAPPED));.  ove
15180 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
15190 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
151a0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
151b0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
151c0 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
151d0 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
151e0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69  7fffffff);.  whi
151f0 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
15200 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
15210 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76  amt, &nRead, &ov
15220 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20  erlapped) &&.   
15230 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
15240 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41  rror()!=ERROR_HA
15250 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64  NDLE_EOF ){.#end
15260 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  if.    DWORD las
15270 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20  tErrno;.    if( 
15280 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
15290 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
152a0 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
152b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
152c0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
152d0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
152e0 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
152f0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
15300 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
15310 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20  READ\n",.       
15320 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
15330 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15340 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
15350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
15360 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
15370 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
15380 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
153b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
153c0 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72   }.  winLogIoerr
153d0 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f  (nRetry, __LINE_
153e0 5f 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  _);.  if( nRead<
153f0 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
15400 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
15410 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
15420 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
15430 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
15440 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
15450 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
15460 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52  nRead);.    OSTR
15470 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
15480 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15490 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
154a0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
154b0 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  D\n",.          
154c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
154d0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
154e0 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
154f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15500 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
15510 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  D;.  }..  OSTRAC
15520 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
15530 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
15540 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
15550 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
15560 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
15570 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15580 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
15590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
155a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
155b0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
155c0 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
155d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
155e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
155f0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
15600 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
15610 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
15620 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
15630 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15650 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
15660 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
15670 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
15680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15690 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69   bytes to be wri
156a0 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  tten */.  int am
156b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
156c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
156d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
156e0 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
156f0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
15700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15710 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
15720 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  le to begin writ
15730 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69  ing at */.){.  i
15740 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15760 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20  * True if error 
15770 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c  has occurred, el
15780 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
15790 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
157a0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
157b0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
157c0 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
157d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
157e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
157f0 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
15800 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
15810 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
15820 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15830 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
15840 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
15850 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
15860 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
15870 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
15880 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70  STRACE(("WRITE p
15890 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
158a0 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  , file=%p, buffe
158b0 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
158c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f   ".           "o
158d0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b  ffset=%lld, lock
158e0 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  =%d\n", osGetCur
158f0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15900 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
15910 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75     pFile->h, pBu
15920 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20  f, amt, offset, 
15930 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
15940 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
15950 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
15960 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54 45  WRITE) && SQLITE
15970 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15980 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
15990 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
159a0 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
159b0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
159c0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
159d0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
159e0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
159f0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
15a00 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
15a10 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
15a20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
15a30 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
15a40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
15a50 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
15a60 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
15a70 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
15a80 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
15a90 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41  RACE(("WRITE-MMA
15aa0 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
15ab0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
15ac0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
15ae0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15af0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15b00 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
15b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15b30 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28     int nCopy = (
15b40 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70  int)(pFile->mmap
15b50 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a  Size - offset);.
15b60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
15b70 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
15b80 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
15b90 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
15ba0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
15bb0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
15bc0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
15bd0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
15be0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
15bf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
15c00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
15c10 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  INCE || defined(
15c20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
15c30 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 72 63  OVERLAPPED).  rc
15c40 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70   = winSeekFile(p
15c50 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
15c60 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65   if( rc==0 ){.#e
15c70 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23  lse.  {.#endif.#
15c80 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
15c90 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28  NCE && !defined(
15ca0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
15cb0 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20  OVERLAPPED).    
15cc0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
15cd0 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  apped;        /*
15ce0 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
15cf0 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65  WriteFile. */.#e
15d00 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65  ndif.    u8 *aRe
15d10 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
15d20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
15d30 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
15d40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
15d50 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
15d60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15d70 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
15d80 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
15d90 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
15dc0 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
15dd0 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
15de0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
15df0 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
15e00 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
15e10 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
15e20 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  () */..#if !SQLI
15e30 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
15e40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
15e50 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
15e60 45 44 29 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ED).    memset(&
15e70 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
15e80 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
15e90 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  ));.    overlapp
15ea0 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
15eb0 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
15ec0 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65  ffffff);.    ove
15ed0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
15ee0 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
15ef0 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
15f00 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a  fffff);.#endif..
15f10 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
15f20 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  0 ){.#if SQLITE_
15f30 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69  OS_WINCE || defi
15f40 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
15f50 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a  _NO_OVERLAPPED).
15f60 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
15f70 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
15f80 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
15f90 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73  rite, 0) ){.#els
15fa0 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  e.      if( !osW
15fb0 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
15fc0 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
15fd0 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70  nWrite, &overlap
15fe0 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20  ped) ){.#endif. 
15ff0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65         if( winRe
16000 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
16010 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
16020 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
16050 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69  Write==0 || nWri
16060 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20  te<=(DWORD)nRem 
16070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72  );.      if( nWr
16080 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
16090 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a  >(DWORD)nRem ){.
160a0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
160b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
160c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or();.        br
160d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
160e0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
160f0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
16100 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
16110 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20  ERLAPPED).      
16120 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65  offset += nWrite
16130 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
16140 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
16150 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
16160 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f  ffffff);.      o
16170 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
16180 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
16190 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
161a0 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
161b0 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
161c0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
161d0 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
161e0 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
161f0 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
16200 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
16210 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
16220 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
16230 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
16240 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
16250 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
16260 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
16270 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
16280 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16290 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
162a0 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54  LL )){.      OST
162b0 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
162c0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
162d0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
162e0 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20  TE_FULL\n",.    
162f0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16300 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16310 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16320 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
16330 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
16340 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69  SQLITE_FULL, pFi
16350 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
16380 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
16390 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53  h);.    }.    OS
163a0 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69  TRACE(("WRITE pi
163b0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
163c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
163d0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c  ITE_IOERR_WRITE\
163e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
163f0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16400 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16410 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16420 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16430 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16440 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  _WRITE, pFile->l
16450 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 22 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46   "winWrite2", pF
16480 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
16490 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67  else{.    winLog
164a0 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f  Ioerr(nRetry, __
164b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 4f  LINE__);.  }.  O
164c0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70  STRACE(("WRITE p
164d0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
164e0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
164f0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
16500 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16510 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16520 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
16530 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16540 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16550 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
16560 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
16570 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
16580 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63  tic int winTrunc
16590 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
165a0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
165b0 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69  t64 nByte){.  wi
165c0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
165d0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
165e0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a   File handle obj
165f0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
16600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
16610 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16620 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  rn code for this
16630 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
16640 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
16650 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16660 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
16670 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 4d 6d  ite3_int64 oldMm
16680 61 70 53 69 7a 65 3b 0a 23 65 6e 64 69 66 0a 0a  apSize;.#endif..
16690 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
166a0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
166b0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
166c0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
166d0 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
166e0 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75  TRUNCATE pid=%lu
166f0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
16700 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20  =%p, size=%lld, 
16710 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
16720 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16730 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16740 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
16750 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c   nByte, pFile->l
16760 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
16770 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
16780 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
16790 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
167a0 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
167b0 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
167c0 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
167d0 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
167e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
167f0 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
16800 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
16810 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
16820 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
16830 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
16840 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
16850 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
16860 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
16870 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
16880 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
16890 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
168a0 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
168b0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
168c0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
168d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
168e0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
168f0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 6c 64  egion ){.    old
16900 4d 6d 61 70 53 69 7a 65 20 3d 20 70 46 69 6c 65  MmapSize = pFile
16910 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 20 20 7d 65  ->mmapSize;.  }e
16920 6c 73 65 7b 0a 20 20 20 20 6f 6c 64 4d 6d 61 70  lse{.    oldMmap
16930 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Size = 0;.  }.  
16940 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
16950 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  le);.#endif..  /
16960 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
16970 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
16980 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
16990 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
169a0 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
169b0 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70  f( winSeekFile(p
169c0 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
169d0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
169e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
169f0 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
16a00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31     "winTruncate1
16a30 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
16a40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d  ;.  }else if( 0=
16a50 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  =osSetEndOfFile(
16a60 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20  pFile->h) &&.   
16a70 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45           ((lastE
16a80 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
16a90 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f  Error())!=ERROR_
16aa0 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45  USER_MAPPED_FILE
16ab0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
16ac0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
16ad0 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
16ae0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
16af0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
16b00 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
16b10 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
16b20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
16b30 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d  uncate2", pFile-
16b40 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69  >zPath);.  }..#i
16b50 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
16b60 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 72  P_SIZE>0.  if( r
16b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16b80 6f 6c 64 4d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  oldMmapSize>0 ){
16b90 0a 20 20 20 20 69 66 28 20 6f 6c 64 4d 6d 61 70  .    if( oldMmap
16ba0 53 69 7a 65 3e 6e 42 79 74 65 20 29 7b 0a 20 20  Size>nByte ){.  
16bb0 20 20 20 20 77 69 6e 4d 61 70 66 69 6c 65 28 70      winMapfile(p
16bc0 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  File, -1);.    }
16bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4d  else{.      winM
16be0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6f 6c  apfile(pFile, ol
16bf0 64 4d 6d 61 70 53 69 7a 65 29 3b 0a 20 20 20 20  dMmapSize);.    
16c00 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
16c10 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
16c20 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
16c30 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
16c40 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
16c50 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
16c60 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
16c70 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  le, pFile->h, sq
16c80 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
16c90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
16ca0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
16cb0 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
16cc0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
16cd0 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
16ce0 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
16cf0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
16d00 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
16d10 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
16d20 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
16d30 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
16d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
16d50 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
16d60 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
16d70 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
16d80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
16d90 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
16da0 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
16db0 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
16dc0 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  tted to disk..*/
16dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
16de0 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
16df0 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
16e00 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
16e10 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20  _NO_SYNC.  /*.  
16e20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65  ** Used only whe
16e30 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
16e40 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
16e50 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63  .   */.  BOOL rc
16e60 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
16e70 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
16e80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16e90 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20  _NO_SYNC) || \. 
16ea0 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54     defined(SQLIT
16eb0 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
16ec0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
16ed0 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
16ee0 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
16ef0 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
16f00 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
16f10 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
16f20 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
16f30 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
16f40 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
16f50 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
16f60 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
16f70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
16f80 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
16f90 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
16fa0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
16fb0 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
16fc0 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
16fd0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
16fe0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
16ff0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
17000 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
17010 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
17020 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
17030 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
17040 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
17050 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
17060 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
17070 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
17080 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
17090 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
170a0 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
170b0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
170c0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
170d0 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53  TE_FULL );..  OS
170e0 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64  TRACE(("SYNC pid
170f0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
17100 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25  file=%p, flags=%
17110 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  x, lock=%d\n",. 
17120 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
17130 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
17140 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
17150 3e 68 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20  >h, flags,.     
17160 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
17170 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65  ktype));..#ifnde
17180 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
17190 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
171a0 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
171b0 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
171c0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
171d0 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
171e0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
171f0 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
17200 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
17210 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
17220 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
17230 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
17240 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
17250 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
17260 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
17270 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
17280 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  NC.  OSTRACE(("S
17290 59 4e 43 2d 4e 4f 50 20 70 69 64 3d 25 6c 75 2c  YNC-NOP pid=%lu,
172a0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
172b0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
172c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
172d0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
172e0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
172f0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
17300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17310 23 65 6c 73 65 0a 23 69 66 20 53 51 4c 49 54 45  #else.#if SQLITE
17320 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
17330 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
17340 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
17350 69 66 28 20 6f 73 46 6c 75 73 68 56 69 65 77 4f  if( osFlushViewO
17360 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61  fFile(pFile->pMa
17370 70 52 65 67 69 6f 6e 2c 20 30 29 20 29 7b 0a 20  pRegion, 0) ){. 
17380 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
17390 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75  YNC-MMAP pid=%lu
173a0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70  , pFile=%p, pMap
173b0 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
173c0 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d              "rc=
173d0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 6f 73  SQLITE_OK\n", os
173e0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
173f0 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20  sId(),.         
17400 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70 46 69        pFile, pFi
17410 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
17420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17430 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
17440 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
17450 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
17460 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41  TRACE(("SYNC-MMA
17470 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
17480 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d  =%p, pMapRegion=
17490 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %p, ".          
174a0 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f       "rc=SQLITE_
174b0 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f  IOERR_MMAP\n", o
174c0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
174d0 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20 20  ssId(),.        
174e0 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70 46         pFile, pF
174f0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
17500 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17510 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
17520 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
17530 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
17540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17550 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 79            "winSy
17560 6e 63 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  nc1", pFile->zPa
17570 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
17580 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 6f 73 46  endif.  rc = osF
17590 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28  lushFileBuffers(
175a0 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d  pFile->h);.  Sim
175b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
175c0 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20  =FALSE );.  if( 
175d0 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  rc ){.    OSTRAC
175e0 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75  E(("SYNC pid=%lu
175f0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
17600 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
17610 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
17620 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
17630 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
17640 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
17650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17660 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17670 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17680 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
17690 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41  ror();.    OSTRA
176a0 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c  CE(("SYNC pid=%l
176b0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
176c0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
176d0 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 0a  IOERR_FSYNC\n",.
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
176f0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
17700 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
17710 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
17720 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
17730 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
17740 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  NC, pFile->lastE
17750 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
17770 6e 53 79 6e 63 32 22 2c 20 70 46 69 6c 65 2d 3e  nSync2", pFile->
17780 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  zPath);.  }.#end
17790 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
177a0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
177b0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
177c0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
177d0 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
177e0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
177f0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
17800 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77  t64 *pSize){.  w
17810 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
17820 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
17830 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17840 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OK;..  assert( i
17850 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
17860 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  ( pSize!=0 );.  
17870 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
17890 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53  ERR_FSTAT);.  OS
178a0 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
178b0 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e  e=%p, pSize=%p\n
178c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69  ", pFile->h, pSi
178d0 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ze));..#if SQLIT
178e0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
178f0 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44     FILE_STANDARD
17900 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20  _INFO info;.    
17910 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  if( osGetFileInf
17920 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
17930 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c  Ex(pFile->h, Fil
17940 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20  eStandardInfo,. 
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f      &info, sizeo
17980 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20  f(info)) ){.    
17990 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e    *pSize = info.
179a0 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61  EndOfFile.QuadPa
179b0 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
179c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
179d0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
179e0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
179f0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
17a00 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
17a10 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
17a20 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
17a40 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
17a50 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
17a60 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  }.  }.#else.  {.
17a70 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42      DWORD upperB
17a80 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
17a90 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  owerBits;.    DW
17aa0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
17ab0 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20      lowerBits = 
17ac0 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  osGetFileSize(pF
17ad0 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
17ae0 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ts);.    *pSize 
17af0 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
17b00 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
17b10 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
17b20 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72      if(   (lower
17b30 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
17b40 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
17b50 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
17b60 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17b70 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20  r())!=NO_ERROR) 
17b80 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
17b90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
17ba0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
17bb0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
17bc0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
17bd0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
17be0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
17bf0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
17c00 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
17c10 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
17c20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
17c30 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
17c40 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70  %p, pSize=%p, *p
17c50 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73  Size=%lld, rc=%s
17c60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17c70 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c  pFile->h, pSize,
17c80 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33   *pSize, sqlite3
17c90 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
17ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17cb0 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
17cc0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
17cd0 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
17ce0 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
17cf0 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
17d00 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
17d10 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
17d20 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
17d30 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
17d40 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c  endif..#ifndef L
17d50 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
17d60 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  E_LOCK.# define 
17d70 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
17d80 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66  VE_LOCK 2.#endif
17d90 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63  ../*.** Historic
17da0 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73  ally, SQLite has
17db0 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c   used both the L
17dc0 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b  ockFile and Lock
17dd0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73  FileEx functions
17de0 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f  ..** When the Lo
17df0 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  ckFile function 
17e00 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73  was used, it was
17e10 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
17e20 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65   to fail.** imme
17e30 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
17e40 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
17e50 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f   obtained.  Also
17e60 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65  , it always expe
17e70 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69  cted to.** obtai
17e80 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  n an exclusive l
17e90 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ock.  These flag
17ea0 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20  s are used with 
17eb0 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
17ec0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  unction.** and r
17ed0 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70  eflect those exp
17ee0 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65  ectations; there
17ef0 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c  fore, they shoul
17f00 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  d not be changed
17f10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
17f20 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
17f30 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
17f40 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
17f50 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  S   (LOCKFILE_FA
17f60 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c  IL_IMMEDIATELY |
17f70 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58       LOCKFILE_EX
17fa0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65  CLUSIVE_LOCK).#e
17fb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72  ndif../*.** Curr
17fc0 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65  ently, SQLite ne
17fd0 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f  ver calls the Lo
17fe0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
17ff0 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e  n without wantin
18000 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  g the.** call to
18010 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c   fail immediatel
18020 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  y if the lock ca
18030 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
18040 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
18050 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
18060 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
18070 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
18080 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f  FLAGS (LOCKFILE_
18090 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
180a0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
180b0 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
180c0 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
180d0 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
180e0 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
180f0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
18100 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
18110 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
18120 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
18130 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
18140 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
18150 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53  .  int res;.  OS
18160 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
18170 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
18180 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
18190 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
181a0 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
181b0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
181c0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
181d0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
181e0 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
181f0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
18200 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
18210 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
18220 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
18230 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
18240 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
18250 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
18260 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
18270 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
18280 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
18290 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
182a0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
182b0 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
182c0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182e0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
182f0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
18300 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
18310 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
18320 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
18330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
18340 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
18350 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
18360 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
18370 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
18380 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
18390 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
183a0 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
183b0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
183c0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
183d0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183f0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
18400 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
18410 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
18420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
18430 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
18440 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
18450 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
18460 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
18470 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
18480 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
18490 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  /.  }.  OSTRACE(
184a0 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65  ("READ-LOCK file
184b0 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e  =%p, result=%d\n
184c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
184d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
184e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
184f0 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74  a readlock.*/.st
18500 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
18510 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  ckReadLock(winFi
18520 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
18530 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c  t res;.  DWORD l
18540 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52  astErrno;.  OSTR
18550 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43  ACE(("READ-UNLOC
18560 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
18570 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
18580 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18590 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
185a0 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  () ){.    res = 
185b0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
185c0 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
185d0 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
185e0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23  _SIZE, 0);.  }.#
185f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
18600 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
18610 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  se{.    res = wi
18620 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
18630 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
18640 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
18650 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
18660 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
18670 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
18680 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
18690 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
186a0 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45  =ERROR_NOT_LOCKE
186b0 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  D) ){.    pFile-
186c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
186d0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
186e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
186f0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69  OERR_UNLOCK, pFi
18700 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18720 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
18730 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
18740 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
18750 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
18760 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
18770 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
18780 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  res));.  return 
18790 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  res;.}../*.** Lo
187a0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
187b0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
187c0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
187d0 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
187e0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
187f0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
18800 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
18810 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
18820 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
18830 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
18840 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
18850 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
18860 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
18870 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
18880 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
18890 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
188a0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
188b0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
188c0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
188d0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
188e0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
188f0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
18900 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
18910 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
18920 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
18930 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
18940 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
18950 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
18960 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
18970 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
18980 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
18990 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
189a0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
189b0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
189c0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
189d0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
189e0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
189f0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
18a00 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
18a10 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
18a20 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
18a30 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
18a40 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
18a50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
18a60 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
18a70 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
18a80 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
18a90 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
18aa0 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
18ab0 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
18ac0 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
18ad0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
18ae0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
18af0 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
18b00 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
18b10 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
18b20 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
18b30 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
18b40 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
18b50 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
18b60 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
18b70 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
18b80 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
18b90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
18ba0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
18bb0 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
18bc0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
18bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18be0 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73  ult of a Windows
18bf0 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
18c00 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
18c10 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46         /* Set pF
18c20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f  ile->locktype to
18c30 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
18c40 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
18c50 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
18c60 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
18c70 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
18c80 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
18c90 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46  s time */.  winF
18ca0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
18cb0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
18cc0 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
18cd0 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
18ce0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
18cf0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
18d00 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25  le=%p, oldLock=%
18d10 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25  d(%d), newLock=%
18d20 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
18d30 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
18d40 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
18d50 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
18d60 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e, locktype));..
18d70 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
18d80 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
18d90 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
18da0 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
18db0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46   on the.  ** OsF
18dc0 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
18dd0 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
18de0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
18df0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69  th, as.  ** sqli
18e00 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
18e10 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
18e20 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
18e30 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
18e40 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
18e50 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
18e60 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25  LOCK-HELD file=%
18e70 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
18e80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18e90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18ea0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
18eb0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
18ec0 20 6b 69 6e 64 20 6f 66 20 77 72 69 74 65 2d 6c   kind of write-l
18ed0 6f 63 6b 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ock on a read-on
18ee0 6c 79 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  ly database.  */
18ef0 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63  .  if( (pFile->c
18f00 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
18f10 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d 30 20 26 26  LE_RDONLY)!=0 &&
18f20 20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52   locktype>=RESER
18f30 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
18f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18f50 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20  ERR_LOCK;.  }.. 
18f60 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
18f70 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
18f80 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
18f90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
18fa0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
18fb0 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
18fc0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
18fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
18fe0 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
18ff0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
19000 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
19010 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
19020 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
19030 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
19040 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e   Lock the PENDIN
19050 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77  G_LOCK byte if w
19060 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72  e need to acquir
19070 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
19080 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45   or.  ** a SHARE
19090 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61  D lock.  If we a
190a0 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
190b0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
190c0 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20  acquisition of. 
190d0 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   ** the PENDING_
190e0 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d  LOCK byte is tem
190f0 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e  porary..  */.  n
19100 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69  ewLocktype = pFi
19110 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
19120 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
19130 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20 20  ype==NO_LOCK.   
19140 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  || (locktype==EX
19150 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
19160 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
19170 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a  =RESERVED_LOCK).
19180 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
19190 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
191a0 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
191b0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
191c0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
191d0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
191e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
19210 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
19220 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
19230 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
19240 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
19250 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  lock.  This is n
19260 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20  eeded to work.  
19270 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72      ** around pr
19280 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
19290 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72   indexing and/or
192a0 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74   anti-virus soft
192b0 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a  ware on.      **
192c0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
192d0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f  ..      ** If yo
192e0 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  u are using this
192f0 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c   code as a model
19300 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65   for alternative
19310 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20   VFSes, do not. 
19320 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69       ** copy thi
19330 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20  s retry logic.  
19340 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74  It is a hack int
19350 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  ended for Window
19360 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  s only..      */
19370 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
19380 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
19390 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
193a0 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
193b0 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
193c0 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74  count=%d, result
193d0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
193e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
193f0 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20   cnt, res));.   
19400 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
19410 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f  ==ERROR_INVALID_
19420 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20  HANDLE ){.      
19430 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
19440 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
19450 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
19460 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
19470 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
19480 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
19490 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72  =%p, count=%d, r
194a0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
194b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
194c0 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33  >h, cnt, sqlite3
194d0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
194e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
194f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19500 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65  if( cnt ) sqlite
19510 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29  3_win32_sleep(1)
19520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
19530 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
19540 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
19550 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
19560 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
19570 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
19580 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
19590 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
195a0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
195b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
195c0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
195d0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
195e0 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
195f0 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52     res = winGetR
19600 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
19610 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
19620 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
19630 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
19640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19650 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
19660 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
19670 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
19680 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
19690 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  D lock.  */.  if
196a0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ( locktype==RESE
196b0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  RVED_LOCK && res
196c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
196d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
196e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
196f0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
19700 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
19710 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
19720 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44  _FLAGS, RESERVED
19730 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
19740 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
19750 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
19760 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
19770 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
19780 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
19790 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
197a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
197b0 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
197c0 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
197d0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
197e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
197f0 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
19800 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
19810 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
19820 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
19830 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
19840 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
19850 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
19860 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
19870 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
19880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
19890 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
198a0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
198b0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
198c0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
198d0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
198e0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
198f0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
19900 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  E_FLAGS, SHARED_
19910 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
19940 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
19950 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
19960 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
19970 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
19980 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
19990 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
199a0 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52  );.      winGetR
199b0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
199c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
199d0 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
199e0 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
199f0 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
19a00 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
19a10 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
19a20 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
19a30 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
19a40 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
19a50 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
19a60 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
19a70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
19a80 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
19a90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
19aa0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
19ab0 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
19ac0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
19ad0 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
19ae0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
19af0 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
19b00 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
19b10 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
19b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
19b30 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
19b40 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
19b50 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
19b60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
19b70 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
19b80 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61  FAIL file=%p, wa
19b90 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c  nted=%d, got=%d\
19ba0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19bb0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
19bc0 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
19bd0 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  ));.  }.  pFile-
19be0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
19bf0 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f  newLocktype;.  O
19c00 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
19c10 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
19c20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
19c30 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
19c40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
19c50 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
19c60 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
19c70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
19c80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
19c90 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
19ca0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
19cb0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
19cc0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
19cd0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
19ce0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
19cf0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
19d00 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
19d10 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
19d20 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
19d30 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
19d40 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
19d50 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
19d60 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65  esOut){.  int re
19d70 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  s;.  winFile *pF
19d80 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
19d90 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
19da0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
19db0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
19dc0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
19dd0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
19de0 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
19df0 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e  %p, pResOut=%p\n
19e00 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65  ", pFile->h, pRe
19e10 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72  sOut));..  asser
19e20 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
19e30 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
19e40 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
19e50 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b   ){.    res = 1;
19e60 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
19e70 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
19e80 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28  =%p, result=%d (
19e90 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
19ea0 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65  ->h, res));.  }e
19eb0 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  lse{.    res = w
19ec0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
19ed0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
19ee0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
19ef0 53 45 52 56 45 44 5f 42 59 54 45 2c 30 2c 31 2c  SERVED_BYTE,0,1,
19f00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
19f10 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f  ){.      winUnlo
19f20 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
19f30 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19f40 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
19f50 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65 73 3b  .    res = !res;
19f60 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
19f70 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
19f80 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28  =%p, result=%d (
19f90 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c  remote)\n", pFil
19fa0 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d  e->h, res));.  }
19fb0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
19fc0 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  s;.  OSTRACE(("T
19fd0 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
19fe0 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%p, pResOut=%p,
19ff0 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
1a000 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1a010 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1a020 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52  >h, pResOut, *pR
1a030 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72  esOut));.  retur
1a040 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a050 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
1a060 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
1a070 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a080 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e   id to locktype.
1a090 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
1a0a0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
1a0b0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
1a0c0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
1a0d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
1a0e0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
1a0f0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
1a100 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
1a110 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1a120 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
1a130 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a140 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  no-op..**.** It 
1a150 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1a160 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
1a170 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20   to fail if the 
1a180 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1a190 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20  ** is NO_LOCK.  
1a1a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1a1b0 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44  gument is SHARED
1a1c0 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20  _LOCK then this 
1a1d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
1a1e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1a1f0 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  OERR;.*/.static 
1a200 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71  int winUnlock(sq
1a210 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a220 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
1a230 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e   int type;.  win
1a240 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
1a250 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
1a260 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
1a280 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
1a290 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
1a2a0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54  ED_LOCK );.  OST
1a2b0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69  RACE(("UNLOCK fi
1a2c0 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25  le=%p, oldLock=%
1a2d0 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25  d(%d), newLock=%
1a2e0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1a2f0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
1a300 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
1a310 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
1a320 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e, locktype));. 
1a330 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c   type = pFile->l
1a340 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74  ocktype;.  if( t
1a350 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype>=EXCLUSIVE_L
1a360 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
1a370 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
1a380 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
1a390 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
1a3a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f  , 0);.    if( lo
1a3b0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
1a3c0 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74 52 65  OCK && !winGetRe
1a3d0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b  adLock(pFile) ){
1a3e0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
1a3f0 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
1a400 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61  en.  We should a
1a410 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f  lways be able to
1a420 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75  .      ** reacqu
1a430 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
1a440 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
1a450 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1a460 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
1a470 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1a480 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1a490 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
1a4a0 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lock", pFile->zP
1a4b0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
1a4c0 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
1a4d0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
1a4e0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
1a4f0 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
1a500 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
1a510 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  );.  }.  if( loc
1a520 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  ktype==NO_LOCK &
1a530 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  & type>=SHARED_L
1a540 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
1a550 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
1a560 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  le);.  }.  if( t
1a570 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
1a580 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
1a590 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
1a5a0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
1a5b0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
1a5c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
1a5d0 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a  = (u8)locktype;.
1a5e0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
1a5f0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
1a600 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1a610 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1a620 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
1a630 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ype, sqlite3ErrN
1a640 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
1a650 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
1a660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1a6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
1a6d0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
1a6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
1a700 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
1a710 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
1a720 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
1a730 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
1a740 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
1a750 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
1a760 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
1a770 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
1a780 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1a790 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
1a7a0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
1a7b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
1a7c0 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
1a7d0 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
1a7e0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
1a7f0 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
1a800 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
1a810 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
1a820 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
1a830 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
1a840 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
1a850 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
1a860 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
1a870 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
1a880 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
1a890 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
1a8a0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
1a8b0 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
1a8c0 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
1a8d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
1a8e0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
1a8f0 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
1a900 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
1a910 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
1a920 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
1a930 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
1a940 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
1a950 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
1a960 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
1a970 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
1a980 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
1a990 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
1a9a0 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
1a9b0 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
1a9c0 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
1a9d0 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
1a9e0 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73   winNolockLock(s
1a9f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1aa00 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
1aa10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1aa20 45 52 28 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(id);.  UNUSED
1aa30 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f 63 6b 74  _PARAMETER(lockt
1aa40 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ype);.  return S
1aa50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
1aa60 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f 63  tic int winNoloc
1aa70 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
1aa80 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
1aa90 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
1aaa0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
1aab0 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e  AMETER(id);.  UN
1aac0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1aad0 52 65 73 4f 75 74 29 3b 0a 20 20 72 65 74 75 72  ResOut);.  retur
1aae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1aaf0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f  static int winNo
1ab00 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
1ab10 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1ab20 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 55 4e   locktype){.  UN
1ab30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
1ab40 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1ab50 41 4d 45 54 45 52 28 6c 6f 63 6b 74 79 70 65 29  AMETER(locktype)
1ab60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ab70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  E_OK;.}../******
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
1ab90 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c  d of the no-op l
1aba0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1abb0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
1abc0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1abd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac10 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1ac20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74  If *pArg is init
1ac30 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74  ially negative t
1ac40 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75  hen this is a qu
1ac50 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20  ery.  Set *pArg 
1ac60 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70  to.** 1 or 0 dep
1ac70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1ac80 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73  r or not bit mas
1ac90 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  k of pFile->ctrl
1aca0 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a  Flags is set..**
1acb0 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
1acc0 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65  0 or 1, then cle
1acd0 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  ar or set the ma
1ace0 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d  sk bit of pFile-
1acf0 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73  >ctrlFlags..*/.s
1ad00 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f  tatic void winMo
1ad10 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70  deBit(winFile *p
1ad20 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  File, unsigned c
1ad30 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70  har mask, int *p
1ad40 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72  Arg){.  if( *pAr
1ad50 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67  g<0 ){.    *pArg
1ad60 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46   = (pFile->ctrlF
1ad70 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b  lags & mask)!=0;
1ad80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70  .  }else if( (*p
1ad90 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Arg)==0 ){.    p
1ada0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1adb0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73  &= ~mask;.  }els
1adc0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  e{.    pFile->ct
1add0 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b  rlFlags |= mask;
1ade0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  .  }.}../* Forwa
1adf0 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
1ae00 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68   VFS helper meth
1ae10 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74 65 6d  ods used for tem
1ae20 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
1ae30 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
1ae40 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65  tTempname(sqlite
1ae50 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a  3_vfs *, char **
1ae60 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
1ae70 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69  nIsDir(const voi
1ae80 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f  d *);.static BOO
1ae90 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  L winIsDriveLett
1aea0 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74  erAndColon(const
1aeb0 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a   char *);../*.**
1aec0 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65   Control and que
1aed0 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  ry of the open f
1aee0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1aef0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
1af00 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1af10 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1af20 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1af30 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
1af40 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
1af50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e  .  OSTRACE(("FCN
1af60 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25  TL file=%p, op=%
1af70 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70  d, pArg=%p\n", p
1af80 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72  File->h, op, pAr
1af90 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  g));.  switch( o
1afa0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1afb0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
1afc0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
1afd0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1afe0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  e->locktype;.   
1aff0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b000 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b010 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b020 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b040 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b050 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53  SQLITE_FCNTL_LAS
1b060 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1b070 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
1b080 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45  int)pFile->lastE
1b090 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52  rrno;.      OSTR
1b0a0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1b0b0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1b0c0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
1b0d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b0e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b0f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b100 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
1b110 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
1b120 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
1b130 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f   *)pArg;.      O
1b140 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1b150 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1b160 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
1b170 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
1b180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1b190 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1b1a0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1b1b0 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NT: {.      if( 
1b1c0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1b1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b1e0 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b  te3_int64 oldSz;
1b1f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
1b200 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64  = winFileSize(id
1b210 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20  , &oldSz);.     
1b220 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b240 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b250 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65  newSz = *(sqlite
1b260 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20  3_int64*)pArg;. 
1b270 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77           if( new
1b280 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20  Sz>oldSz ){.    
1b290 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1b2a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1b2b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1b2c0 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69   = winTruncate(i
1b2d0 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20  d, newSz);.     
1b2e0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1b2f0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1b300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f       }.        O
1b320 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1b330 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1b340 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
1b350 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1b360 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1b370 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b380 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b390 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b3a0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b3b0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b3d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b3e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
1b3f0 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
1b400 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
1b410 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  le, WINFILE_PERS
1b420 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70  IST_WAL, (int*)p
1b430 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Arg);.      OSTR
1b440 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1b450 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1b460 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
1b470 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b490 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b4a0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
1b4b0 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
1b4c0 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46     winModeBit(pF
1b4d0 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f  ile, WINFILE_PSO
1b4e0 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
1b4f0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b500 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b510 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1b520 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b540 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1b550 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b560 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  VFSNAME: {.     
1b570 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1b580 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1b590 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56  ("%s", pFile->pV
1b5a0 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs->zName);.    
1b5b0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1b5c0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1b5d0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
1b5e0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1b5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b600 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1b610 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
1b620 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20  2_AV_RETRY: {.  
1b630 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e      int *a = (in
1b640 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  t*)pArg;.      i
1b650 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20  f( a[0]>0 ){.   
1b660 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
1b670 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  ry = a[0];.     
1b680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b690 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52  a[0] = winIoerrR
1b6a0 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  etry;.      }.  
1b6b0 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29      if( a[1]>0 )
1b6c0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65  {.        winIoe
1b6d0 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61  rrRetryDelay = a
1b6e0 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [1];.      }else
1b6f0 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d  {.        a[1] =
1b700 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
1b710 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lay;.      }.   
1b720 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b730 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b740 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b750 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b770 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b780 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
1b790 33 32 5f 47 45 54 5f 48 41 4e 44 4c 45 3a 20 7b  32_GET_HANDLE: {
1b7a0 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20  .      LPHANDLE 
1b7b0 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44  phFile = (LPHAND
1b7c0 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20 2a  LE)pArg;.      *
1b7d0 70 68 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e  phFile = pFile->
1b7e0 68 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  h;.      OSTRACE
1b7f0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1b800 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1b810 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b820 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b830 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
1b840 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1b850 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b860 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f  FCNTL_WIN32_SET_
1b870 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20  HANDLE: {.      
1b880 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20  LPHANDLE phFile 
1b890 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67  = (LPHANDLE)pArg
1b8a0 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  ;.      HANDLE h
1b8b0 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d  OldFile = pFile-
1b8c0 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  >h;.      pFile-
1b8d0 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20 20  >h = *phFile;.  
1b8e0 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 68 4f      *phFile = hO
1b8f0 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f 53  ldFile;.      OS
1b900 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 6f 6c  TRACE(("FCNTL ol
1b910 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69 6c  dFile=%p, newFil
1b920 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b930 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
1b940 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c 20        hOldFile, 
1b950 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b970 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1b980 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b990 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
1b9a0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  AME: {.      cha
1b9b0 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20  r *zTFile = 0;. 
1b9c0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
1b9d0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  nGetTempname(pFi
1b9e0 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c  le->pVfs, &zTFil
1b9f0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1ba00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ba10 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1ba20 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1ba30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
1ba40 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1ba50 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
1ba60 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
1ba70 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1ba80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ba90 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
1baa0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1bab0 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
1bac0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1bad0 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  E: {.      i64 n
1bae0 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  ewLimit = *(i64*
1baf0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74  )pArg;.      int
1bb00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bb10 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1bb20 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61  mit>sqlite3Globa
1bb30 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29  lConfig.mxMmap )
1bb40 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1bb50 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  it = sqlite3Glob
1bb60 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b  alConfig.mxMmap;
1bb70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1bb80 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
1bb90 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 65 20  newLimit may be 
1bba0 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 74 20  eventually cast 
1bbb0 74 6f 20 28 53 49 5a 45 5f 54 29 20 61 6e 64 20  to (SIZE_T) and 
1bbc0 70 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  passed.      ** 
1bbd0 74 6f 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  to MapViewOfFile
1bbe0 28 29 2e 20 52 65 73 74 72 69 63 74 20 69 74 73  (). Restrict its
1bbf0 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69 66   value to 2GB if
1bc00 20 28 53 49 5a 45 5f 54 29 20 69 73 20 6e 6f 74   (SIZE_T) is not
1bc10 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61   at.      ** lea
1bc20 73 74 20 61 20 36 34 2d 62 69 74 20 74 79 70 65  st a 64-bit type
1bc30 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  . */.      if( n
1bc40 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69 7a  ewLimit>0 && siz
1bc50 65 6f 66 28 53 49 5a 45 5f 54 29 3c 38 20 29 7b  eof(SIZE_T)<8 ){
1bc60 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
1bc70 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26 20  t = (newLimit & 
1bc80 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20 20  0x7FFFFFFF);.   
1bc90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36     }..      *(i6
1bca0 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
1bcb0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1bcc0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1bcd0 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
1bce0 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
1bcf0 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
1bd00 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
1bd10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1bd20 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
1bd30 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
1bd40 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1bd50 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1bd60 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
1bd70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
1bd80 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70  c = winMapfile(p
1bd90 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
1bda0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bdb0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1bdc0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
1bdd0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
1bde0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1bdf0 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
1be00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
1be10 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  dif.  }.  OSTRAC
1be20 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1be30 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54  p, rc=SQLITE_NOT
1be40 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  FOUND\n", pFile-
1be50 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
1be60 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1be70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1be80 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1be90 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
1bea0 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
1beb0 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
1bec0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1bed0 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
1bee0 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
1bef0 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
1bf00 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
1bf10 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
1bf20 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
1bf30 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
1bf40 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
1bf50 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
1bf60 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
1bf70 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
1bf80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
1bf90 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
1bfa0 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
1bfb0 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
1bfc0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
1bfd0 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
1bfe0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
1bff0 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
1c000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1c010 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
1c020 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1c030 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74   (void)id;.  ret
1c040 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
1c050 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1c060 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1c070 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
1c080 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1c090 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
1c0a0 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
1c0b0 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1c0c0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1c0d0 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69  winFile *p = (wi
1c0e0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74  nFile*)id;.  ret
1c0f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
1c100 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
1c110 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20  N_OPEN |.       
1c120 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73    ((p->ctrlFlags
1c130 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29   & WINFILE_PSOW)
1c140 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f  ?SQLITE_IOCAP_PO
1c150 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1c160 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E:0);.}../*.** W
1c170 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
1c180 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
1c190 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
1c1a0 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
1c1b0 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
1c1c0 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
1c1d0 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
1c1e0 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
1c1f0 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
1c200 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
1c210 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
1c220 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ize..*/.static S
1c230 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
1c240 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20  sInfo;..#ifndef 
1c250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1c260 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
1c270 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
1c280 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
1c290 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
1c2a0 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
1c2b0 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
1c2c0 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
1c2d0 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
1c2e0 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69  s used by.** thi
1c2f0 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
1c300 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72  hich may be shar
1c310 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
1c320 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
1c330 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74  nction winShmMut
1c340 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
1c350 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
1c360 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
1c370 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  ex.** is held wh
1c380 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
1c390 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
1c3a0 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
1c3b0 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  of assert().** s
1c3c0 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
1c3d0 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
1c3e0 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
1c3f0 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
1c400 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
1c410 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
1c420 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
1c430 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
1c440 77 69 6e 42 69 67 4c 6f 63 6b 20 3d 20 30 3b 0a  winBigLock = 0;.
1c450 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1c460 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  hmEnterMutex(voi
1c470 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1c480 74 65 78 5f 65 6e 74 65 72 28 77 69 6e 42 69 67  tex_enter(winBig
1c490 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Lock);.}.static 
1c4a0 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
1c4b0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
1c4c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1c4d0 76 65 28 77 69 6e 42 69 67 4c 6f 63 6b 29 3b 0a  ve(winBigLock);.
1c4e0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
1c4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1c500 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
1c510 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
1c520 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c530 77 69 6e 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 23  winBigLock);.}.#
1c540 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  endif../*.** Obj
1c550 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1c560 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66  esent a single f
1c570 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d  ile opened and m
1c580 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64  mapped to provid
1c590 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  e.** shared memo
1c5a0 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70  ry.  When multip
1c5b0 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
1c5c0 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
1c5d0 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  e.** log-summary
1c5e0 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61  , each thread ha
1c5f0 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c  s its own winFil
1c600 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  e object, but th
1c610 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20  ey all.** point 
1c620 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
1c630 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1c640 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
1c650 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f  ords, each.** lo
1c660 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65  g-summary is ope
1c670 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  ned only once pe
1c680 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
1c690 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1c6a0 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
1c6b0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
1c6c0 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
1c6d0 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
1c6e0 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
1c6f0 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
1c700 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
1c710 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20  **      nRef.** 
1c720 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a       pNext.**.**
1c730 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1c740 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
1c750 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
1c760 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
1c770 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  .**.**      fid.
1c780 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
1c790 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77  e.**.** Either w
1c7a0 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  inShmNode.mutex 
1c7b0 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
1c7c0 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
1c7d0 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d  =0 and.** winShm
1c7e0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
1c7f0 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
1c800 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
1c810 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
1c820 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
1c830 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77  ..**.*/.struct w
1c840 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71  inShmNode {.  sq
1c850 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
1c860 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
1c870 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
1c880 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
1c890 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
1c8a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1c8b0 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1c8c0 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20   winFile hFile; 
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c8e0 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
1c8f0 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e  winOpen */..  in
1c900 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
1c910 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c920 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1c930 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
1c940 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  nt nRegion;     
1c950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c960 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
1c970 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65  ion */.  u8 isRe
1c980 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
1c990 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1c9a0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38  ead-only */.  u8
1c9b0 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20   isUnlocked;    
1c9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c9d0 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20   if no DMS lock 
1c9e0 68 65 6c 64 20 2a 2f 0a 0a 20 20 73 74 72 75 63  held */..  struc
1c9f0 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
1ca00 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
1ca10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1ca20 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
1ca30 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1ca40 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
1ca50 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
1ca60 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1ca70 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
1ca80 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
1ca90 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
1caa0 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
1cab0 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cad0 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
1cae0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1caf0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
1cb00 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
1cb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1cb20 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
1cb30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1cb40 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1cb50 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1cb60 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
1cb70 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
1cb80 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
1cb90 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1cba0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1cbb0 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
1cbc0 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 6e 65  S_TRACE).  u8 ne
1cbd0 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
1cbe0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
1cbf0 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
1cc00 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
1cc10 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
1cc20 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
1cc30 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
1cc40 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
1cc50 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1cc60 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
1cc70 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
1cc80 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
1cc90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
1cca0 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
1ccb0 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
1ccc0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
1ccd0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
1cce0 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
1ccf0 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
1cd00 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
1cd10 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
1cd20 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1cd30 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1cd40 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1cd50 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
1cd60 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1cd70 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
1cd80 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
1cd90 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
1cda0 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
1cdb0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
1cdc0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
1cdd0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
1cde0 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
1cdf0 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
1ce00 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
1ce10 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
1ce20 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
1ce30 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
1ce40 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
1ce50 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
1ce60 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1ce70 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
1ce80 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
1ce90 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1cea0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
1ceb0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1cec0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
1ced0 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cef0 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
1cf00 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
1cf10 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
1cf20 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1cf30 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1cf40 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1cf50 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
1cf60 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1cf70 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1cf80 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1cf90 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  d */.#if defined
1cfa0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
1cfb0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1cfc0 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a  _HAVE_OS_TRACE).
1cfd0 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cff0 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
1d000 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77  ction with its w
1d010 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e  inShmNode */.#en
1d020 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  dif.};../*.** Co
1d030 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
1d040 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
1d050 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45  ine WIN_SHM_BASE
1d060 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
1d070 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
1d080 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
1d090 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
1d0a0 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20  e WIN_SHM_DMS   
1d0b0 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53   (WIN_SHM_BASE+S
1d0c0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1d0d0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
1d0e0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
1d0f0 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  ply advisory loc
1d100 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74  ks for all n byt
1d110 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  es beginning at 
1d120 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ofst..*/.#define
1d130 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 20 31   WINSHM_UNLCK  1
1d140 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f  .#define WINSHM_
1d150 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
1d160 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 20 33   WINSHM_WRLCK  3
1d170 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1d180 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
1d190 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c  winShmNode *pFil
1d1a0 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c  e,    /* Apply l
1d1b0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1d1c0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1d1d0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1d1e0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1d1f0 20 20 20 2f 2a 20 57 49 4e 53 48 4d 5f 55 4e 4c     /* WINSHM_UNL
1d200 43 4b 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b  CK, WINSHM_RDLCK
1d210 2c 20 6f 72 20 57 49 4e 53 48 4d 5f 57 52 4c 43  , or WINSHM_WRLC
1d220 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d240 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  Offset to first 
1d250 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
1d260 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  d/unlocked */.  
1d270 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20  int nByte       
1d280 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d290 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
1d2a0 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b   or unlock */.){
1d2b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1d2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1d2d0 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63  lt code form Loc
1d2e0 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29  k/UnlockFileEx()
1d2f0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
1d300 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   to the winShmNo
1d310 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
1d320 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
1d330 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
1d340 74 28 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d  t( pFile->nRef==
1d350 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
1d360 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
1d370 75 74 65 78 29 20 29 3b 0a 0a 20 20 4f 53 54 52  utex) );..  OSTR
1d380 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66  ACE(("SHM-LOCK f
1d390 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
1d3a0 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65   offset=%d, size
1d3b0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1d3c0 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e     pFile->hFile.
1d3d0 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73  h, lockType, ofs
1d3e0 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f  t, nByte));..  /
1d3f0 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72  * Release/Acquir
1d400 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  e the system-lev
1d410 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28  el lock */.  if(
1d420 20 6c 6f 63 6b 54 79 70 65 3d 3d 57 49 4e 53 48   lockType==WINSH
1d430 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
1d440 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  c = winUnlockFil
1d450 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
1d460 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  h, ofst, 0, nByt
1d470 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
1d480 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1d490 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
1d4a0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
1d4b0 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20  DWORD dwFlags = 
1d4c0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
1d4d0 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69  MEDIATELY;.    i
1d4e0 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 57  f( lockType == W
1d4f0 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77  INSHM_WRLCK ) dw
1d500 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c  Flags |= LOCKFIL
1d510 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
1d520 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
1d530 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
1d540 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c  File.h, dwFlags,
1d550 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
1d560 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
1d570 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63  rc!= 0 ){.    rc
1d580 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d590 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1d5a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f  ->lastErrno =  o
1d5b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1d5c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d5d0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _BUSY;.  }..  OS
1d5e0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1d5f0 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25   file=%p, func=%
1d600 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63  s, errno=%lu, rc
1d610 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1d620 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e     pFile->hFile.
1d630 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  h, (lockType == 
1d640 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20  WINSHM_UNLCK) ? 
1d650 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20  "winUnlockFile" 
1d660 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77 69  :.           "wi
1d670 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nLockFile", pFil
1d680 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71  e->lastErrno, sq
1d690 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1d6a0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1d6b0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1d6c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
1d6d0 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
1d6e0 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
1d6f0 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
1d700 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
1d710 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
1d720 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
1d730 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
1d740 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
1d750 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
1d760 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
1d770 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
1d780 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
1d790 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
1d7a0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
1d7b0 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
1d7c0 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1d7d0 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
1d7e0 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
1d7f0 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
1d800 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
1d810 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1d820 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
1d830 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1d840 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
1d850 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
1d860 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
1d870 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
1d880 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1d890 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ) );.  OSTRACE((
1d8a0 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25  "SHM-PURGE pid=%
1d8b0 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25  lu, deleteFlag=%
1d8c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1d8d0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1d8e0 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65  cessId(), delete
1d8f0 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26  Flag));.  pp = &
1d900 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
1d910 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
1d920 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
1d930 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
1d940 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1d950 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
1d960 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  { sqlite3_mutex_
1d970 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20  free(p->mutex); 
1d980 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
1d990 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
1d9a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f  ++){.        BOO
1d9b0 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56  L bRc = osUnmapV
1d9c0 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65  iewOfFile(p->aRe
1d9d0 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20  gion[i].pMap);. 
1d9e0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1d9f0 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50  "SHM-PURGE-UNMAP
1da00 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1da10 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1da40 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1da50 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1da60 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1da70 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1da80 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 20  UE(bRc);.       
1da90 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61   bRc = osCloseHa
1daa0 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  ndle(p->aRegion[
1dab0 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].hMap);.      
1dac0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1dad0 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d  PURGE-CLOSE pid=
1dae0 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20  %lu, region=%d, 
1daf0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1db00 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1db10 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1db20 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b  (), i, bRc ? "ok
1db30 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1db40 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56          UNUSED_V
1db50 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52  ARIABLE_VALUE(bR
1db60 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
1db70 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
1db80 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69  !=NULL && p->hFi
1db90 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  le.h!=INVALID_HA
1dba0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
1dbb0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1dbc0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1dbd0 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
1dbe0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1dbf0 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
1dc00 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1dc10 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1dc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1dc30 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
1dc40 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1dc50 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1dc60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1dc70 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
1dc80 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  c();.        win
1dc90 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e  Delete(pVfs, p->
1dca0 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
1dcb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
1dcc0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1dcd0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1dce0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1dcf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dd00 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1dd10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1dd20 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
1dd30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1dd40 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
1dd50 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
1dd60 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1dd70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
1dd80 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e 6f 74  DMS lock has not
1dd90 20 79 65 74 20 62 65 65 6e 20 74 61 6b 65 6e 20   yet been taken 
1dda0 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70 53 68 6d  on shm file pShm
1ddb0 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74 20 74 6f  Node. Attempt to
1ddc0 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f 77 2e  .** take it now.
1ddd0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1dde0 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
1ddf0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
1de00 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
1de10 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
1de20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74 20 62  the DMS cannot b
1de30 65 20 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65  e locked because
1de40 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 6f   this is a reado
1de50 6e 6c 79 5f 73 68 6d 3d 31 0a 2a 2a 20 63 6f 6e  nly_shm=1.** con
1de60 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 20 6f  nection and no o
1de70 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 6c 72  ther process alr
1de80 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c 6f 63  eady holds a loc
1de90 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  k, return.** SQL
1dea0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
1deb0 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20 70 53  TINIT and set pS
1dec0 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b  hmNode->isUnlock
1ded0 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ed=1..*/.static 
1dee0 69 6e 74 20 77 69 6e 4c 6f 63 6b 53 68 61 72 65  int winLockShare
1def0 64 4d 65 6d 6f 72 79 28 77 69 6e 53 68 6d 4e 6f  dMemory(winShmNo
1df00 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a 20  de *pShmNode){. 
1df10 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 53 68 6d   int rc = winShm
1df20 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1df30 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52 4c 43  ode, WINSHM_WRLC
1df40 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1df50 31 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  1);..  if( rc==S
1df60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1df70 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
1df80 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
1df90 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e    pShmNode->isUn
1dfa0 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20  locked = 1;.    
1dfb0 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
1dfc0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
1dfd0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1dfe0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1dff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e000 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49  READONLY_CANTINI
1e010 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1e020 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
1e030 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1e040 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
1e050 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   ){.      winShm
1e060 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1e070 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43  ode, WINSHM_UNLC
1e080 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1e090 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
1e0a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1e0b0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1e0c0 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1e0d0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1e0f0 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f  inLockSharedMemo
1e100 72 79 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ry", pShmNode->z
1e110 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
1e120 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1e130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e140 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1e150 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1e160 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
1e170 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a 0a  M_DMS, 1);.  }..
1e180 20 20 72 65 74 75 72 6e 20 77 69 6e 53 68 6d 53    return winShmS
1e190 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1e1a0 64 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b  de, WINSHM_RDLCK
1e1b0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1e1c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
1e1d0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1e1e0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1e1f0 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
1e200 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
1e210 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
1e220 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
1e230 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
1e240 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
1e250 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
1e260 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
1e270 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
1e280 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
1e290 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
1e2a0 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
1e2b0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1e2c0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
1e2d0 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
1e2e0 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
1e2f0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
1e300 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
1e310 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
1e320 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e340 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1e350 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1e360 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1e370 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
1e380 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1e390 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1e3a0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1e3b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e3d0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1e3e0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1e3f0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
1e400 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
1e410 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
1e420 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
1e430 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1e440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1e450 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
1e460 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
1e470 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
1e480 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
1e490 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
1e4a0 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
1e4b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
1e4c0 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
1e4d0 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
1e4e0 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
1e4f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
1e500 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
1e510 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
1e520 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
1e530 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1e540 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  o( sizeof(*p) );
1e550 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1e560 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e570 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
1e580 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
1e590 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a  trlen30(pDbFd->z
1e5a0 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Path);.  pNew = 
1e5b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1e5c0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  o( sizeof(*pShmN
1e5d0 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ode) + nName + 1
1e5e0 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  7 );.  if( pNew=
1e5f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1e600 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72  3_free(p);.    r
1e610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e620 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
1e630 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65   }.  pNew->zFile
1e640 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
1e650 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
1e660 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
1e670 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
1e680 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
1e690 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1e6a0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
1e6b0 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
1e6c0 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1e6d0 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74  e);..  /* Look t
1e6e0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
1e6f0 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69  s an existing wi
1e700 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61  nShmNode that ca
1e710 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20  n be used..  ** 
1e720 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77  If no matching w
1e730 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e  inShmNode curren
1e740 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61  tly exists, crea
1e750 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
1e760 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1e770 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
1e780 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d  ShmNode = winShm
1e790 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f  NodeList; pShmNo
1e7a0 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68  de; pShmNode=pSh
1e7b0 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  mNode->pNext){. 
1e7c0 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74     /* TBD need t
1e7d0 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62  o come up with b
1e7e0 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65  etter match here
1e7f0 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a  .  Perhaps.    *
1e800 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f  * use FILE_ID_BO
1e810 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75  TH_DIR_INFO Stru
1e820 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
1e830 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1e840 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ICmp(pShmNode->z
1e850 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e  Filename, pNew->
1e860 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20  zFilename)==0 ) 
1e870 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1e880 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20   pShmNode ){.   
1e890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1e8a0 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ew);.  }else{.  
1e8b0 20 20 69 6e 74 20 69 6e 46 6c 61 67 73 20 3d 20    int inFlags = 
1e8c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 3b  SQLITE_OPEN_WAL;
1e8d0 0a 20 20 20 20 69 6e 74 20 6f 75 74 46 6c 61 67  .    int outFlag
1e8e0 73 20 3d 20 30 3b 0a 0a 20 20 20 20 70 53 68 6d  s = 0;..    pShm
1e8f0 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
1e900 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
1e910 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
1e920 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
1e930 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
1e940 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
1e950 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
1e960 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
1e970 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
1e980 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
1e990 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
1e9a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
1e9b0 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Mutex ){.      p
1e9c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
1e9d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1e9e0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1e9f0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69  X_FAST);.      i
1ea00 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
1ea10 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
1ea20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1ea30 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
1ea40 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f         goto shm_
1ea50 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  open_err;.      
1ea60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
1ea70 20 30 3d 3d 73 71 6c 69 74 65 33 5f 75 72 69 5f   0==sqlite3_uri_
1ea80 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a  boolean(pDbFd->z
1ea90 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f  Path, "readonly_
1eaa0 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20  shm", 0) ){.    
1eab0 20 20 69 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c    inFlags |= SQL
1eac0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1ead0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1eae0 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 7d 65 6c  _CREATE;.    }el
1eaf0 73 65 7b 0a 20 20 20 20 20 20 69 6e 46 6c 61 67  se{.      inFlag
1eb00 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1eb10 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
1eb20 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
1eb30 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 70  n(pDbFd->pVfs, p
1eb40 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1eb50 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
1eb60 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
1eb70 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
1eb80 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
1eb90 20 20 20 20 20 20 20 69 6e 46 6c 61 67 73 2c 20         inFlags, 
1eba0 26 6f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  &outFlags);.    
1ebb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ebc0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1ebd0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 72 63 2c 20  winLogError(rc, 
1ebe0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1ebf0 2c 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 0a  , "winOpenShm",.
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1ec20 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
1ec30 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1ec40 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
1ec50 69 66 28 20 6f 75 74 46 6c 61 67 73 3d 3d 53 51  if( outFlags==SQ
1ec60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1ec70 4c 59 20 29 20 70 53 68 6d 4e 6f 64 65 2d 3e 69  LY ) pShmNode->i
1ec80 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 0a  sReadonly = 1;..
1ec90 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
1eca0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 53 68  SharedMemory(pSh
1ecb0 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  mNode);.    if( 
1ecc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1ecd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45 41 44   rc!=SQLITE_READ
1ece0 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 29 20  ONLY_CANTINIT ) 
1ecf0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1ed00 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
1ed10 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
1ed20 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
1ed30 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
1ed40 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
1ed50 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 20  = pShmNode;.#if 
1ed60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1ed70 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1ed80 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f  (SQLITE_HAVE_OS_
1ed90 54 52 41 43 45 29 0a 20 20 70 2d 3e 69 64 20 3d  TRACE).  p->id =
1eda0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
1edb0 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
1edc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
1edd0 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
1ede0 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65   = p;.  winShmLe
1edf0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
1ee00 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
1ee10 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
1ee20 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1ee30 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
1ee40 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
1ee50 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ver of the winSh
1ee60 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  mEnterMutex() mu
1ee70 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
1ee80 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
1ee90 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69  * new (struct wi
1eea0 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  nShm) object to 
1eeb0 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
1eec0 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
1eed0 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
1eee0 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
1eef0 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
1ef00 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
1ef10 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
1ef20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
1ef30 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
1ef40 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
1ef50 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
1ef60 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a  mNode->mutex.  *
1ef70 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
1ef80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1ef90 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1efa0 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
1efb0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
1efc0 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
1efd0 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
1efe0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1eff0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1f000 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1f010 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
1f020 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
1f030 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
1f040 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
1f050 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
1f060 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1f070 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69  HM_DMS, 1);.  wi
1f080 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d  nShmPurge(pDbFd-
1f090 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20  >pVfs, 0);      
1f0a0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
1f0b0 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
1f0c0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
1f0d0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1f0e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1f0f0 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  w);.  winShmLeav
1f100 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1f110 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f120 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
1f130 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1f140 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
1f150 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73   underlying.** s
1f160 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
1f170 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
1f180 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1f190 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
1f1a0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1f1b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f1c0 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
1f1d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
1f1e0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
1f1f0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1f200 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
1f210 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1f220 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
1f230 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f240 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
1f250 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
1f260 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1f270 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
1f280 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
1f290 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
1f2a0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
1f2b0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
1f2c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1f2d0 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
1f2e0 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
1f2f0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f300 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1f310 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
1f320 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1f330 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
1f340 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
1f350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f360 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
1f370 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
1f380 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
1f390 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
1f3a0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
1f3b0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
1f3c0 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
1f3d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1f3e0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1f3f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
1f400 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
1f410 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
1f420 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
1f430 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
1f440 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
1f450 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
1f460 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
1f470 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
1f480 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
1f490 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f4a0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1f4b0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
1f4c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
1f4d0 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
1f4e0 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
1f4f0 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
1f500 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1f510 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
1f520 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1f530 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1f540 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
1f550 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
1f560 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1f570 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
1f580 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
1f590 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
1f5a0 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
1f5b0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
1f5c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f5d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
1f5e0 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
1f5f0 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
1f600 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
1f610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1f620 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
1f630 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1f640 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1f650 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
1f660 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1f670 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
1f6a0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1f6b0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
1f6c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f6d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f6e0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
1f6f0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1f700 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f720 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1f730 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
1f740 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
1f750 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1f760 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
1f770 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
1f780 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1f790 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
1f7a0 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
1f7b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
1f7c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
1f7d0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
1f7e0 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1f810 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
1f820 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
1f830 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
1f840 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
1f850 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f860 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1f870 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1f880 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
1f890 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
1f8c0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
1f8d0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
1f8e0 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
1f8f0 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
1f900 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
1f910 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
1f920 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
1f930 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1f940 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1f950 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1f960 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1f970 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1f980 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
1f990 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1f9a0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1f9b0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
1f9c0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
1f9d0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1f9e0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1f9f0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1fa00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
1fa10 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
1fa20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1fa30 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
1fa40 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
1fa50 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
1fa60 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
1fa70 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
1fa80 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
1fa90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1faa0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1fab0 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
1fac0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
1fad0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
1fae0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
1faf0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
1fb00 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
1fb10 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
1fb20 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
1fb30 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
1fb40 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
1fb50 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
1fb60 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
1fb70 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1fb80 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
1fb90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fba0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
1fbb0 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
1fbc0 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
1fbd0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
1fbe0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1fbf0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1fc00 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
1fc10 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
1fc20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
1fc30 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
1fc40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1fc50 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1fc60 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55  hmNode, WINSHM_U
1fc70 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
1fc80 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1fc90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1fca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fcb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
1fcc0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
1fcd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1fce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fcf0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
1fd00 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
1fd10 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1fd20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
1fd30 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1fd40 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1fd50 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
1fd60 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
1fd70 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
1fd80 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
1fd90 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
1fda0 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
1fdb0 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
1fdc0 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
1fdd0 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
1fde0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1fdf0 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
1fe00 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
1fe10 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
1fe20 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
1fe30 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
1fe40 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
1fe50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1fe60 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1fe70 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1fe80 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1fe90 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1fea0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1feb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1fec0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1fed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fee0 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
1fef0 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
1ff00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1ff10 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
1ff20 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1ff30 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
1ff40 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
1ff50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ff60 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
1ff70 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
1ff80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ff90 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1ffa0 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48  (pShmNode, WINSH
1ffb0 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_RDLCK, ofst+WI
1ffc0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1ffd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ffe0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fff0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
20000 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
20010 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
20020 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
20030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20040 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
20050 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
20060 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
20070 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
20080 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
20090 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
200a0 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
200b0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
200c0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
200d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
200e0 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
200f0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
20100 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
20110 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
20120 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
20130 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
20140 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
20150 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
20160 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
20170 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
20180 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
20190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
201a0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
201b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
201c0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
201d0 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
201e0 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
201f0 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
20200 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
20210 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
20220 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
20230 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20240 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
20250 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
20260 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57 52 4c  Node, WINSHM_WRL
20270 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
20280 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
20290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
202a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
202b0 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
202c0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
202d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
202e0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
202f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20300 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
20310 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
20320 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
20330 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70  ACE(("SHM-LOCK p
20340 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73  id=%lu, id=%d, s
20350 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20  haredMask=%03x, 
20360 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72  exclMask=%03x, r
20370 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
20380 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20390 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e  ProcessId(), p->
203a0 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  id, p->sharedMas
203b0 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
203c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
203d0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
203e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
203f0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
20400 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
20410 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
20420 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
20430 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  ry..**.** All lo
20440 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
20450 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
20460 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
20470 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
20480 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
20490 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
204a0 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
204b0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
204c0 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
204d0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
204e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
204f0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
20500 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
20510 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20520 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74  TER(fd);.  sqlit
20530 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  e3MemoryBarrier(
20540 29 3b 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72  );   /* compiler
20550 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20  -defined memory 
20560 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  barrier */.  win
20570 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
20580 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d         /* Also m
20590 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64  utex, for redund
205a0 61 6e 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ancy */.  winShm
205b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
205c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
205d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
205e0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
205f0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
20600 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  gion of the.** s
20610 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
20620 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
20630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
20640 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
20650 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20   regions.** are 
20660 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
20670 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
20680 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
20690 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
206a0 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  on.** bytes in s
206b0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
206c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
206d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
206e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
206f0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
20700 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
20710 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65  , if the isWrite
20720 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
20730 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
20740 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
20750 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
20760 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
20770 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
20780 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
20790 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
207a0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
207b0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
207c0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
207d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
207e0 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20  . If.** isWrite 
207f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
20800 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
20810 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
20820 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a  on has not yet.*
20830 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
20840 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  , it is allocate
20850 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
20860 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
20870 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
20880 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  egion has alread
20890 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
208a0 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   or is allocated
208b0 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c   by.** this call
208c0 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
208d0 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ove, then it is 
208e0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
208f0 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64   processes.** ad
20900 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
20910 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
20920 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
20930 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
20940 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20  apped.** memory 
20950 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
20960 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
20970 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28  c int winShmMap(
20980 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20990 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
209a0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
209b0 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
209c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
209d0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
209e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
209f0 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
20a00 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
20a30 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  gions */.  int i
20a40 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  sWrite,         
20a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20a60 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
20a70 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
20a80 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
20a90 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
20aa0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
20ab0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
20ac0 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
20ad0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
20ae0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20  .  winShm *pShm 
20af0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
20b00 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
20b10 6d 4e 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 70  mNode;.  DWORD p
20b20 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
20b30 41 44 57 52 49 54 45 3b 0a 20 20 44 57 4f 52 44  ADWRITE;.  DWORD
20b40 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41   flags = FILE_MA
20b50 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
20b60 41 50 5f 52 45 41 44 3b 0a 20 20 69 6e 74 20 72  AP_READ;.  int r
20b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
20b80 20 20 69 66 28 20 21 70 53 68 6d 20 29 7b 0a 20    if( !pShm ){. 
20b90 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
20ba0 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
20bb0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
20bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
20bd0 72 6e 20 72 63 3b 0a 20 20 20 20 70 53 68 6d 20  rn rc;.    pShm 
20be0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
20bf0 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20   }.  pShmNode = 
20c00 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  pShm->pShmNode;.
20c10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
20c20 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
20c30 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70  >mutex);.  if( p
20c40 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63  ShmNode->isUnloc
20c50 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ked ){.    rc = 
20c60 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  winLockSharedMem
20c70 6f 72 79 28 70 53 68 6d 4e 6f 64 65 29 3b 0a 20  ory(pShmNode);. 
20c80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20c90 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 68 6d 70  E_OK ) goto shmp
20ca0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 70 53 68  age_out;.    pSh
20cb0 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65  mNode->isUnlocke
20cc0 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  d = 0;.  }.  ass
20cd0 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
20ce0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
20cf0 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
20d00 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
20d10 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
20d20 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
20d30 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d  {.    struct Shm
20d40 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20  Region *apNew;  
20d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
20d60 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  aRegion[] array 
20d70 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
20d80 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
20d90 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
20da0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
20db0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
20dc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
20df0 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66  e of wal-index f
20e00 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  ile */..    pShm
20e10 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
20e20 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
20e30 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
20e40 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
20e50 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
20e60 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
20e70 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
20e80 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
20e90 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
20ea0 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
20eb0 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
20ec0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
20ed0 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
20ee0 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
20ef0 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
20f00 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  /.    rc = winFi
20f10 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
20f20 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
20f30 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20  ->hFile, &sz);. 
20f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20f60 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
20f70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
20f80 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  IZE, osGetLastEr
20f90 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
20fb0 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46  inShmMap1", pDbF
20fc0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
20fd0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20fe0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
20ff0 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20  ( sz<nByte ){.  
21000 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
21010 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
21020 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
21030 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73  t. If isWrite is
21040 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
21050 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c   zero, exit earl
21060 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
21070 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
21080 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
21090 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
210a0 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
210b0 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69  ly, if isWrite i
210c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20  s non-zero, use 
210d0 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
210e0 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
210f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
21100 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
21110 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
21120 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f   !isWrite ) goto
21130 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
21140 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
21150 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
21160 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
21170 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  hFile, nByte);. 
21180 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
211a0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
211b0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
211c0 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
211d0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211f0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22      "winShmMap2"
21200 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
21210 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
21220 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
21230 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21240 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
21250 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
21260 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
21270 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
21280 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
21290 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65   = (struct ShmRe
212a0 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72  gion *)sqlite3_r
212b0 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20 20  ealloc64(.      
212c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
212d0 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
212e0 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d  *sizeof(apNew[0]
212f0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
21300 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
21310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
21320 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
21330 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
21340 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
21350 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
21360 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
21370 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
21380 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
21390 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47     protect = PAG
213a0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
213b0 20 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d    flags = FILE_M
213c0 41 50 5f 52 45 41 44 3b 0a 20 20 20 20 7d 0a 0a  AP_READ;.    }..
213d0 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
213e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
213f0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
21400 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c  ANDLE hMap = NUL
21410 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  L;         /* fi
21420 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
21430 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
21440 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
21450 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
21460 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
21470 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  /..#if SQLITE_OS
21480 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61  _WINRT.      hMa
21490 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
214a0 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70  MappingFromApp(p
214b0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
214c0 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
214d0 2c 20 70 72 6f 74 65 63 74 2c 20 6e 42 79 74 65  , protect, nByte
214e0 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
214f0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
21500 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
21510 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20  IDE).      hMap 
21520 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
21530 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d  ppingW(pShmNode-
21540 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
21550 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63      NULL, protec
21560 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  t, 0, nByte, NUL
21570 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
21580 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
21590 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
215a0 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
215b0 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
215c0 47 41 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  GA.      hMap = 
215d0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
215e0 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
215f0 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
21600 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c    NULL, protect,
21610 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
21620 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
21630 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21640 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70  SHM-MAP-CREATE p
21650 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
21660 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25  d, size=%d, rc=%
21670 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
21680 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21690 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
216a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
216b0 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
216c0 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f         hMap ? "o
216d0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
216e0 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20  .      if( hMap 
216f0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
21700 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64  Offset = pShmNod
21710 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
21720 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ion;.        int
21730 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
21740 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
21750 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
21760 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69  nGranularity;.#i
21770 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
21780 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  T.        pMap =
21790 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
217a0 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 66 6c  FromApp(hMap, fl
217b0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
217c0 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
217d0 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
217e0 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
217f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
21800 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
21810 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
21820 28 68 4d 61 70 2c 20 66 6c 61 67 73 2c 0a 20 20  (hMap, flags,.  
21830 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66            0, iOf
21840 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
21850 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
21860 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
21870 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
21880 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
21890 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64  "SHM-MAP-MAP pid
218a0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
218b0 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65   offset=%d, size
218c0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
218f0 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
21900 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66  e->nRegion, iOff
21910 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
21920 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20        szRegion, 
21930 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  pMap ? "ok" : "f
21940 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
21950 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61  }.      if( !pMa
21960 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  p ){.        pSh
21970 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
21980 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
21990 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r();.        rc 
219a0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
219b0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
219c0 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73  P, pShmNode->las
219d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70   "winShmMap3", p
21a00 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
21a10 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
21a20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
21a30 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
21a40 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
21a50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
21a60 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
21a70 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
21a80 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
21a90 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21aa0 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
21ab0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
21ac0 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
21ad0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
21ae0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
21af0 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
21b00 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
21b10 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
21b20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
21b30 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
21b40 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
21b50 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
21b60 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
21b70 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
21b80 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
21b90 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
21ba0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
21bb0 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
21bc0 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
21bd0 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
21be0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
21bf0 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  *pp = 0;.  }.  i
21c00 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
21c10 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53  eadonly && rc==S
21c20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
21c30 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
21c40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21c50 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
21c60 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
21c70 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
21c80 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
21c90 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
21ca0 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
21cb0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
21cc0 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
21cd0 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
21ce0 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
21cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21d00 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
21d10 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70  leans up the map
21d20 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68  ped region of th
21d30 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
21d40 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66  , if any..*/.#if
21d50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
21d60 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
21d70 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  nt winUnmapfile(
21d80 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
21d90 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
21da0 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
21db0 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
21dc0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
21dd0 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65   hMap=%p, pMapRe
21de0 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
21df0 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d        "mmapSize=
21e00 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61  %lld, mmapSizeMa
21e10 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20  x=%lld\n",.     
21e20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
21e30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
21e40 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61  File, pFile->hMa
21e50 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  p, pFile->pMapRe
21e60 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  gion,.          
21e70 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
21e80 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  , pFile->mmapSiz
21e90 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46  eMax));.  if( pF
21ea0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
21eb0 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e  ){.    if( !osUn
21ec0 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
21ed0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
21ee0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
21ef0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
21f00 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
21f10 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
21f20 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
21f30 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
21f40 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
21f60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
21f70 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
21f80 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
21f90 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
21fa0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61        pFile->pMa
21fb0 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
21fc0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
21fd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
21fe0 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
21ff0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22010 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31    "winUnmapfile1
22020 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
22030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
22040 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
22050 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  0;.    pFile->mm
22060 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a  apSize = 0;.  }.
22070 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
22080 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
22090 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
220a0 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
220b0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
220c0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
220d0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
220e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
220f0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
22100 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
22110 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
22120 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
22130 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
22140 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
22150 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
22160 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
22170 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
22180 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22190 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
221a0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221c0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
221d0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
221e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
221f0 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
22200 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
22210 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
22220 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
22230 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
22240 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
22250 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
22260 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
22270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22280 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
22290 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
222a0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
222b0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
222c0 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
222d0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
222e0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
222f0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
22300 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
22310 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74  ew). Or, if.** t
22320 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
22330 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
22340 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
22350 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
22360 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
22370 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
22380 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
22390 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
223a0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
223b0 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
223c0 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
223d0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
223e0 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 0a  quested size of.
223f0 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
22400 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
22410 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
22420 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
22430 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71   then the.** req
22440 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
22450 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
22460 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
22470 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
22480 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
22490 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
224a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
224b0 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
224c0 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75   configured.** u
224d0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
224e0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69  L_MMAP_SIZE, whi
224f0 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
22500 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
22510 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
22520 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
22530 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
22540 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
22550 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
22560 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
22570 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
22580 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
22590 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
225a0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
225b0 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
225c0 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73  (winFile *pFd, s
225d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
225e0 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  te){.  sqlite3_i
225f0 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74  nt64 nMap = nByt
22600 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
22610 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
22620 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
22630 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  t==0 );.  OSTRAC
22640 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
22650 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
22660 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  size=%lld\n",.  
22670 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
22680 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
22690 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a  , pFd, nByte));.
226a0 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
226b0 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
226c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
226d0 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
226e0 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
226f0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
22700 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20  )pFd, &nMap);.  
22710 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22720 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
22730 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
22740 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
22750 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22  E_IOERR_FSTAT\n"
22760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22770 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22780 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
22790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
227a0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
227b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
227c0 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
227d0 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
227e0 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
227f0 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d  izeMax;.  }.  nM
22800 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f  ap &= ~(sqlite3_
22810 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66  int64)(winSysInf
22820 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31  o.dwPageSize - 1
22830 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d  );..  if( nMap==
22840 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69  0 && pFd->mmapSi
22850 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55  ze>0 ){.    winU
22860 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
22870 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70   }.  if( nMap!=p
22880 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
22890 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
228a0 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72   0;.    DWORD pr
228b0 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
228c0 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44  DONLY;.    DWORD
228d0 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41   flags = FILE_MA
228e0 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e  P_READ;..    win
228f0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
22900 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d  #ifdef SQLITE_MM
22910 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  AP_READWRITE.   
22920 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
22930 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52  lags & WINFILE_R
22940 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
22950 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47     protect = PAG
22960 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  E_READWRITE;.   
22970 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45     flags |= FILE
22980 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20  _MAP_WRITE;.    
22990 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
229a0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
229b0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
229c0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
229d0 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20  FromApp(pFd->h, 
229e0 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e  NULL, protect, n
229f0 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69  Map, NULL);.#eli
22a00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22a10 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
22a20 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
22a30 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
22a40 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55  pingW(pFd->h, NU
22a50 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20  LL, protect,.   
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
22a80 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20  ORD)((nMap>>32) 
22a90 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20  & 0xffffffff),. 
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
22ac0 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78  DWORD)(nMap & 0x
22ad0 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29  ffffffff), NULL)
22ae0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
22af0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
22b00 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45  _ANSI) && SQLITE
22b10 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c  _WIN32_CREATEFIL
22b20 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 70 46  EMAPPINGA.    pF
22b30 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
22b40 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
22b50 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
22b60 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
22b90 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
22ba0 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
22bd0 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
22be0 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
22bf0 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
22c00 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
22c10 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
22c20 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
22c30 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
22c40 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
22c50 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
22c60 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
22c90 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le1", pFd->zPath
22ca0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
22cb0 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
22cc0 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
22cd0 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
22ce0 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
22cf0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
22d00 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70  AP-FILE-CREATE p
22d10 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
22d20 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
22d30 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
22d40 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
22d50 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
22d60 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
22d70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22d80 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
22d90 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25   assert( (nMap %
22da0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
22db0 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20  geSize)==0 );.  
22dc0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
22dd0 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66  (SIZE_T)==sizeof
22de0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
22df0 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66  || nMap<=0xfffff
22e00 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  fff );.#if SQLIT
22e10 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
22e20 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
22e30 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64  fFileFromApp(pFd
22e40 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
22e50 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
22e60 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
22e70 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
22e80 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  e(pFd->hMap, fla
22e90 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f  gs, 0, 0, (SIZE_
22ea0 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a  T)nMap);.#endif.
22eb0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55      if( pNew==NU
22ec0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  LL ){.      osCl
22ed0 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68  oseHandle(pFd->h
22ee0 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d  Map);.      pFd-
22ef0 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
22f00 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
22f10 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
22f20 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
22f30 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
22f40 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
22f50 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
22f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22f70 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
22f80 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74  ile2", pFd->zPat
22f90 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
22fa0 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
22fb0 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
22fc0 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
22fd0 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
22fe0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22ff0 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64  MAP-FILE-MAP pid
23000 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
23010 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
23020 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
23030 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
23040 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
23050 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
23060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23070 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
23080 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
23090 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e   pNew;.    pFd->
230a0 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
230b0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
230c0 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
230d0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
230e0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
230f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
23100 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
23110 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75  ), pFd));.  retu
23120 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23130 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23140 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
23150 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
23160 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
23170 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
23180 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
23190 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
231a0 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
231b0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
231c0 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
231d0 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
231e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
231f0 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
23200 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
23210 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
23220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
23230 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
23240 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
23250 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
23260 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
23270 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
23280 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
23290 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
232a0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
232b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
232c0 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
232d0 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
232e0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
232f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
23300 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
23310 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
23320 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
23330 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  eventually.** re
23340 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
23350 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
23360 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
23370 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
23380 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
23390 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
233a0 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
233b0 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
233c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
233d0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
233e0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
233f0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
23400 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
23410 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
23420 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
23430 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
23440 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
23450 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
23460 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
23470 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
23480 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
23490 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
234a0 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
234b0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
234c0 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
234d0 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
234e0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
234f0 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
23500 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
23510 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
23520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
23530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23540 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23550 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
23560 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
23570 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23580 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
23590 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
235a0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
235b0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
235c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
235d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
235e0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
235f0 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
23600 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
23610 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
23620 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
23630 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
23640 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
23650 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
23660 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
23670 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
23680 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
23690 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
236a0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
236b0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
236c0 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
236d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
236e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
236f0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
23700 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
23710 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23720 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65  releases a.** re
23730 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
23740 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
23750 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
23760 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
23770 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
23780 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
23790 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
237a0 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
237b0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
237c0 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
237d0 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
237e0 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
237f0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
23800 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
23810 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
23820 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23830 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a   being called.**
23840 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
23850 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
23860 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
23870 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
23880 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e  mapping.** may n
23890 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
238a0 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
238b0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
238c0 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73  int winUnfetch(s
238d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
238e0 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20   i64 iOff, void 
238f0 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
23900 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
23910 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
23920 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
23930 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
23940 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
23950 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d   */..  /* If p==
23960 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
23970 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
23980 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
23990 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a  outstanding.  **
239a0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
239b0 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
239c0 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
239d0 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
239e0 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
239f0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
23a00 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
23a10 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
23a20 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
23a30 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
23a40 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
23a50 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
23a60 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
23a70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
23a80 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
23a90 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
23aa0 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53  )[iOff] );..  OS
23ab0 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
23ac0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
23ad0 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  p, offset=%lld, 
23ae0 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
23af0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
23b00 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
23b10 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20  , iOff, p));..  
23b20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64  if( p ){.    pFd
23b30 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20  ->nFetchOut--;. 
23b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
23b50 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77  IXME:  If Window
23b60 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70  s truly always p
23b70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69  revents truncati
23b80 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61  ng or deleting a
23b90 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69  .    ** file whi
23ba0 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20  le a mapping is 
23bb0 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66  held, then the f
23bc0 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61  ollowing winUnma
23bd0 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20  pfile() call.   
23be0 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61   ** is unnecessa
23bf0 72 79 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ry can be omitte
23c00 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  d - potentially 
23c10 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a  improving.    **
23c20 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a   performance.  *
23c30 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  /.    winUnmapfi
23c40 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
23c50 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
23c60 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e  tchOut>=0 );.#en
23c70 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
23c80 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
23c90 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
23ca0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
23cb0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
23cc0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
23cd0 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   fd));.  return 
23ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23cf0 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
23d00 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
23d10 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
23d20 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
23d30 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
23d40 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
23d50 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
23d60 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
23d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d80 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
23d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
23dd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
23de0 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
23df0 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
23e00 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
23e10 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
23e20 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
23e30 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
23e40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23e50 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
23e60 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
23e90 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
23ec0 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
23ef0 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
23f20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
23f50 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
23f80 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
23fb0 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fd0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
23fe0 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
24010 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
24020 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24030 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
24040 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
24050 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
24060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
24070 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
24080 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
240b0 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
240c0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
240d0 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
240e0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
240f0 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24110 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
24120 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
24150 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
24160 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
24170 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
24180 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
24190 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
241a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
241b0 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
241c0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
241d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
241e0 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
241f0 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
24200 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
24210 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  etch */.};../*.*
24220 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
24230 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
24240 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
24250 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20  perate on an.** 
24260 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72  sqlite3_file for
24270 20 77 69 6e 33 32 20 77 69 74 68 6f 75 74 20 70   win32 without p
24280 65 72 66 6f 72 6d 69 6e 67 20 61 6e 79 20 6c 6f  erforming any lo
24290 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
242a0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
242b0 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4e  o_methods winIoN
242c0 6f 6c 6f 63 6b 4d 65 74 68 6f 64 20 3d 20 7b 0a  olockMethod = {.
242d0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242f0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
24300 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20  .  winClose,    
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a     /* xClose */.
24330 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20    winRead,      
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20    /* xRead */.  
24360 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20  winWrite,       
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77  /* xWrite */.  w
24390 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  inTruncate,     
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
243b0 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
243c0 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20   winSync,       
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77   /* xSync */.  w
243f0 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  inFileSize,     
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24410 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20  * xFileSize */. 
24420 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20   winNolockLock, 
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77   /* xLock */.  w
24450 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  inNolockUnlock, 
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24470 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77  * xUnlock */.  w
24480 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  inNolockCheckRes
24490 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f  ervedLock,     /
244a0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
244b0 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Lock */.  winFil
244c0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
244d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
244e0 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77  leControl */.  w
244f0 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  inSectorSize,   
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24510 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
24520 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  .  winDeviceChar
24530 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20  acteristics,    
24540 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
24550 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
24560 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20    winShmMap,    
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a    /* xShmMap */.
24590 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20    winShmLock,   
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
245c0 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  .  winShmBarrier
245d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
245e0 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
245f0 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d  r */.  winShmUnm
24600 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
24610 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
24620 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63  map */.  winFetc
24630 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
24640 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
24650 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74  ch */.  winUnfet
24660 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
24670 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
24680 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69  tch */.};..stati
24690 63 20 77 69 6e 56 66 73 41 70 70 44 61 74 61 20  c winVfsAppData 
246a0 77 69 6e 41 70 70 44 61 74 61 20 3d 20 7b 0a 20  winAppData = {. 
246b0 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 2c 20 20   &winIoMethod,  
246c0 20 20 20 20 20 2f 2a 20 70 4d 65 74 68 6f 64 20       /* pMethod 
246d0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
246e0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
246f0 44 61 74 61 20 2a 2f 0a 20 20 30 20 20 20 20 20  Data */.  0     
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24710 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a   bNoLock */.};..
24720 73 74 61 74 69 63 20 77 69 6e 56 66 73 41 70 70  static winVfsApp
24730 44 61 74 61 20 77 69 6e 4e 6f 6c 6f 63 6b 41 70  Data winNolockAp
24740 70 44 61 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e  pData = {.  &win
24750 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64 2c 20  IoNolockMethod, 
24760 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20  /* pMethod */.  
24770 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
24780 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
24790 2a 2f 0a 20 20 31 20 20 20 20 20 20 20 20 20 20  */.  1          
247a0 20 20 20 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c           /* bNoL
247b0 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a  ock */.};../****
247c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
247f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24800 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
24810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24820 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
24830 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
24840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24850 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
24860 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
24870 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
24880 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
24890 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
248a0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
248b0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
248c0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a  __CYGWIN__)./*.*
248d0 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65  * Convert a file
248e0 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76  name from whatev
248f0 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  er the underlyin
24900 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
24910 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66  em.** supports f
24920 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74  or filenames int
24930 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
24940 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
24950 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  lt is.** obtaine
24960 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
24970 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
24980 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
24990 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
249a0 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76  ic char *winConv
249b0 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
249c0 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46  e(const void *zF
249d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
249e0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
249f0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
24a00 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
24a10 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ed = winUnicodeT
24a20 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29  oUtf8(zFilename)
24a30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
24a40 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
24a50 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
24a60 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 4d  Converted = winM
24a70 62 63 73 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e  bcsToUtf8(zFilen
24a80 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  ame, osAreFileAp
24a90 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23  isANSI());.  }.#
24aa0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
24ab0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
24ac0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
24ad0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
24ae0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
24af0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
24b00 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
24b10 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
24b20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
24b30 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
24b40 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
24b50 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
24b60 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
24b70 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
24b80 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
24b90 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
24ba0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
24bb0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
24bc0 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
24bd0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
24be0 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
24bf0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
24c00 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
24c10 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
24c20 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
24c30 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
24c40 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
24c50 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
24c60 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
24c70 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
24c80 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
24c90 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 46 69  inUtf8ToMbcs(zFi
24ca0 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c  lename, osAreFil
24cb0 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
24cc0 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
24cd0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
24ce0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
24cf0 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
24d00 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erted;.}../*.** 
24d10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
24d20 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
24d30 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
24d40 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66  UTF-8 string buf
24d50 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68  fer.** ends with
24d60 20 61 20 64 69 72 65 63 74 6f 72 79 20 73 65 70   a directory sep
24d70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
24d80 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63   or one was succ
24d90 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65  essfully.** adde
24da0 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  d to it..*/.stat
24db0 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e  ic int winMakeEn
24dc0 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42  dInDirSep(int nB
24dd0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
24de0 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20  .  if( zBuf ){. 
24df0 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71     int nLen = sq
24e00 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
24e10 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  uf);.    if( nLe
24e20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n>0 ){.      if(
24e30 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75   winIsDirSep(zBu
24e40 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20  f[nLen-1]) ){.  
24e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
24e60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
24e70 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20  nLen+1<nBuf ){. 
24e80 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e         zBuf[nLen
24e90 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70  ] = winGetDirSep
24ea0 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66  ();.        zBuf
24eb0 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nLen+1] = '\0';
24ec0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24ed0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
24ee0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
24ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
24f00 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
24f10 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65  e name and store
24f20 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70   the resulting p
24f30 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75  ointer into pzBu
24f40 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  f..** The pointe
24f50 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a  r returned in pz
24f60 42 75 66 20 6d 75 73 74 20 62 65 20 66 72 65 65  Buf must be free
24f70 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72  d via sqlite3_fr
24f80 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
24f90 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
24fa0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
24fb0 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42  pVfs, char **pzB
24fc0 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
24fd0 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
24fe0 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
24ff0 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
25000 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
25010 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
25020 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
25030 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b  ;.  size_t i, j;
25040 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71  .  int nPre = sq
25050 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
25060 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
25070 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d  REFIX);.  int nM
25080 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20  ax, nBuf, nDir, 
25090 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42  nLen;.  char *zB
250a0 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  uf;..  /* It's o
250b0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
250c0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
250d0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
250e0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
250f0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
25100 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
25110 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
25120 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
25130 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
25140 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53  ailing..  */.  S
25150 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
25160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25170 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ERR );..  /* All
25180 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  ocate a temporar
25190 79 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  y buffer to stor
251a0 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  e the fully qual
251b0 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20  ified file.  ** 
251c0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d  name for the tem
251d0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66  porary file.  If
251e0 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20   this fails, we 
251f0 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e  cannot continue.
25200 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70  .  */.  nMax = p
25210 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b  Vfs->mxPathname;
25220 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32   nBuf = nMax + 2
25230 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74  ;.  zBuf = sqlit
25240 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
25250 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75  uf );.  if( !zBu
25260 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  f ){.    OSTRACE
25270 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
25280 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
25290 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
252a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
252b0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
252c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
252d0 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
252e0 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ive temporary di
252f0 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c  rectory.  First,
25300 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20   check if one.  
25310 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  ** has been expl
25320 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68  icitly set by th
25330 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f  e application; o
25340 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
25350 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  e one.  ** confi
25360 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65  gured by the ope
25370 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20  rating system.. 
25380 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61   */.  nDir = nMa
25390 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b  x - (nPre + 15);
253a0 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e  .  assert( nDir>
253b0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
253c0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
253d0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69  y ){.    int nDi
253e0 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  rLen = sqlite3St
253f0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74  rlen30(sqlite3_t
25400 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
25410 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
25420 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
25430 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69  winIsDirSep(sqli
25440 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
25450 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29  ry[nDirLen-1]) )
25460 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65  {.        nDirLe
25470 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
25480 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e     if( nDirLen>n
25490 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Dir ){.        s
254a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
254b0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
254c0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
254d0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
254e0 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  OR\n"));.       
254f0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
25500 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
25510 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
25520 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
25530 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25540 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
25550 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c   zBuf, "%s", sql
25560 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
25570 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ory);.    }.  }.
25580 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
25590 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a  GWIN__).  else{.
255a0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
255b0 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
255c0 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a  = {.       0, /*
255d0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
255e0 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20  TMPDIR") */.    
255f0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
25600 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  "TMPDIR") */.   
25610 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
25620 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  ("TMP") */.     
25630 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
25640 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20  TEMP") */.      
25650 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55   0, /* getenv("U
25660 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a  SERPROFILE") */.
25670 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70         "/var/tmp
25680 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f  ",.       "/usr/
25690 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74  tmp",.       "/t
256a0 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c  mp",.       ".",
256b0 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20  .       0       
256c0 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
256d0 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  tor */.    };.  
256e0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
256f0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
25700 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20   *zDir = 0;..   
25710 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
25720 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
25730 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
25740 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
25750 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
25760 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
25770 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
25780 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
25790 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
257a0 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66  v("TMP");.    if
257b0 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61  ( !azDirs[3] ) a
257c0 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e  zDirs[3] = geten
257d0 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69  v("TEMP");.    i
257e0 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20  f( !azDirs[4] ) 
257f0 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65  azDirs[4] = gete
25800 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
25810 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
25820 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
25830 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
25840 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
25850 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69  i++]){.      voi
25860 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
25870 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30       if( zDir==0
25880 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25890 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74     /* If the pat
258a0 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  h starts with a 
258b0 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c  drive letter fol
258c0 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c  lowed by the col
258d0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72  on.      ** char
258e0 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74  acter, assume it
258f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61   is already a na
25900 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b  tive Win32 path;
25910 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   otherwise,.    
25920 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20    ** it must be 
25930 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e  converted to a n
25940 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
25950 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e 20   via the Cygwin 
25960 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69  API.      ** pri
25970 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a  or to using it..
25980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
25990 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  f( winIsDriveLet
259a0 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72  terAndColon(zDir
259b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ) ){.        zCo
259c0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
259d0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
259e0 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20  name(zDir);.    
259f0 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
25a00 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
25a10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
25a20 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
25a30 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
25a40 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
25a50 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
25a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
25a70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
25a80 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
25a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
25aa0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
25ab0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
25ac0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
25ad0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
25ae0 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20  , "%s", zDir);. 
25af0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25b00 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
25b10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
25b20 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
25b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25b40 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
25b50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25b60 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
25b70 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
25b80 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20  ero( nMax+1 );. 
25b90 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
25ba0 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
25bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25bc0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
25bd0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
25be0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
25bf0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
25c00 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
25c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25c20 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
25c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25c40 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
25c50 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
25c60 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29          osIsNT()
25c70 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
25c80 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
25c90 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72  X_TO_WIN_A, zDir
25ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25cb0 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d    zConverted, nM
25cc0 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  ax+1)<0 ){.     
25cd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25ce0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25cf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25d00 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
25d10 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
25d20 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
25d30 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  c=SQLITE_IOERR_C
25d40 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  ONVPATH\n"));.  
25d50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
25d60 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
25d70 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
25d80 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
25db0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20  nGetTempname2", 
25dc0 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zDir);.        }
25dd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e  .        if( win
25de0 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
25df0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
25e00 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
25e10 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e   we know the can
25e20 64 69 64 61 74 65 20 64 69 72 65 63 74 6f 72 79  didate directory
25e30 20 65 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75   exists and shou
25e40 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ld.          ** 
25e50 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65  be used.  Howeve
25e60 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74  r, we may need t
25e70 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74  o convert the st
25e80 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ring containing.
25e90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
25ea0 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38   name into UTF-8
25eb0 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20   (i.e. if it is 
25ec0 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77  UTF-16 right now
25ed0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
25ee0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
25ef0 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
25f00 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
25f10 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
25f20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 55 74          if( !zUt
25f30 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f8 ){.          
25f40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25f50 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
25f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25f70 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
25f80 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
25f90 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
25fa0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
25fb0 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
25fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
25fd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25fe0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
25ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
26000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
26010 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
26020 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20   zUtf8);.       
26030 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26040 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20  zUtf8);.        
26050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26060 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
26070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
26090 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
260a0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  verted);.      }
260b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66  .    }.  }.#elif
260c0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
260d0 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
260e0 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65  CYGWIN__).  else
260f0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
26100 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
26110 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 57  i;.    LPWSTR zW
26120 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69 74 65  idePath = sqlite
26130 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
26140 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20  x*sizeof(WCHAR) 
26150 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57 69 64  );.    if( !zWid
26160 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73  ePath ){.      s
26170 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
26180 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
26190 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
261a0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
261b0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
261c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
261d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
261e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
261f0 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28   osGetTempPathW(
26200 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29  nMax, zWidePath)
26210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
26220 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
26230 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
26240 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
26250 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
26260 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
26270 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
26280 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
26290 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
262a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
262b0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
262c0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
262d0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
262f0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c  inGetTempname2",
26300 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
26310 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f  Multi = winUnico
26320 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
26330 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
26340 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
26350 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
26360 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
26370 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
26380 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c  qlite3_free(zMul
26390 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
263a0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
263b0 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  h);.    }else{. 
263c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
263d0 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
263e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
263f0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
26400 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
26410 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
26420 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
26430 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26440 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
26450 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
26460 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
26470 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
26480 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
26490 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
264a0 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71   *zMbcsPath = sq
264b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
264c0 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28   nMax );.    if(
264d0 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20   !zMbcsPath ){. 
264e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
264f0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
26500 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26510 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26520 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
26530 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26540 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
26550 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
26560 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
26570 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63  PathA(nMax, zMbc
26580 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  sPath)==0 ){.   
26590 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
265a0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
265b0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
265c0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
265d0 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
265e0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
265f0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
26600 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
26610 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c  TEMPPATH, osGetL
26620 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26640 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
26650 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20  name3", 0);.    
26660 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 77 69  }.    zUtf8 = wi
26670 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 4d 62 63  nMbcsToUtf8(zMbc
26680 73 50 61 74 68 2c 20 6f 73 41 72 65 46 69 6c 65  sPath, osAreFile
26690 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20  ApisANSI());.   
266a0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
266b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
266c0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
266d0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
266e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
266f0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
26700 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
26710 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
26720 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
26730 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
26740 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
26750 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
26760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
26770 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
26780 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
26790 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
267a0 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64  HAS_ANSI */.#end
267b0 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53  if /* !SQLITE_OS
267c0 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a  _WINRT */..  /*.
267d0 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
267e0 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d 70  ke sure the temp
267f0 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
26800 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70 70  ends with an app
26810 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65  ropriate.  ** se
26820 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20  parator.  If it 
26830 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65  does not and the
26840 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
26850 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61   space left to a
26860 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69  dd.  ** one, fai
26870 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77  l..  */.  if( !w
26880 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
26890 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20  p(nDir+1, zBuf) 
268a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
268b0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
268c0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
268d0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
268e0 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
268f0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
26900 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
26910 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
26920 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a  name4", 0);.  }.
26930 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
26940 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
26950 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
26960 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
26970 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20  temporary file. 
26980 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20   ** name in the 
26990 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74  following format
269a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c  :.  **.  **   "<
269b0 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
269c0 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58  ory>/etilqs_XXXX
269d0 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22  XXXXXXXXXXX\0\0"
269e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f  .  **.  ** If no
269f0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
26a00 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d  _ERROR.  The num
26a10 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20 68  ber 17 is used h
26a20 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ere in order to.
26a30 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72    ** account for
26a40 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
26a50 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61 63  by the 15 charac
26a60 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69  ter random suffi
26a70 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74  x and the.  ** t
26a80 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20  wo trailing NUL 
26a90 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65  characters.  The
26aa0 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79   final directory
26ab0 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
26ac0 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c  cter.  ** has al
26ad0 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20 69  ready added if i
26ae0 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t was not alread
26af0 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a  y present..  */.
26b00 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33    nLen = sqlite3
26b10 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
26b20 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50    if( (nLen + nP
26b30 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20  re + 17) > nBuf 
26b40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
26b50 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
26b60 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26b70 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26b80 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
26b90 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
26ba0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
26bb0 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
26bc0 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a  name5", 0);.  }.
26bd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26be0 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e  ntf(nBuf-16-nLen
26bf0 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c  , zBuf+nLen, SQL
26c00 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
26c10 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71  EFIX);..  j = sq
26c20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
26c30 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
26c40 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
26c50 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
26c60 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
26c70 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
26c80 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
26c90 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
26ca0 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
26cb0 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
26cc0 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
26cd0 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
26ce0 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a   0;.  *pzBuf = z
26cf0 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  Buf;..  OSTRACE(
26d00 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
26d10 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
26d20 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29  TE_OK\n", zBuf))
26d30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26d40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
26d50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
26d60 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
26d70 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
26d80 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
26d90 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
26da0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
26db0 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
26dc0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
26dd0 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
26de0 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
26df0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
26e00 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
26e10 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
26e20 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
26e30 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
26e40 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
26e50 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f  tErrno;..  if( o
26e60 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
26e70 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
26e80 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
26e90 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
26ea0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
26eb0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
26ec0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
26ed0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
26ee0 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
26ef0 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
26f00 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
26f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
26f30 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
26f40 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
26f70 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
26f80 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26f90 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
26fa0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
26fb0 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
26fc0 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
26fd0 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
26fe0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
26ff0 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
27000 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
27010 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
27020 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
27030 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
27040 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
27050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
27060 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
27070 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
27080 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
27090 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
270a0 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20  ;.}../* forward 
270b0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
270c0 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
270d0 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
270e0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
270f0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
27100 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
27110 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
27120 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27130 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
27140 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27160 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
27170 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
27180 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
27190 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
271a0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
271b0 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  t */.);../*.** O
271c0 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
271d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
271e0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
271f0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
27200 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d 61  * Used to get ma
27210 78 69 6d 75 6d 20 70 61 74 68 20 6c 65 6e 67 74  ximum path lengt
27220 68 20 61 6e 64 20 41 70 70 44 61 74 61 20 2a 2f  h and AppData */
27230 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27240 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
27250 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
27260 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
27270 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
27280 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
27290 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
272a0 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
272b0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
272c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
272d0 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
272e0 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
272f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
27300 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
27310 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
27320 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
27330 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
27340 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
27350 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
27360 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
27370 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
27380 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
27390 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
273a0 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
273b0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
273c0 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
273d0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 56  0;.#endif.  winV
273e0 66 73 41 70 70 44 61 74 61 20 2a 70 41 70 70 44  fsAppData *pAppD
273f0 61 74 61 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ata;.  winFile *
27400 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
27410 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
27420 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
27430 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
27440 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e  me in OS encodin
27450 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
27460 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a  r *zUtf8Name = z
27470 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  Name; /* Filenam
27480 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  e in UTF-8 encod
27490 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ing */.  int cnt
274a0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
274b0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
274c0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
274d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
274e0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
274f0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
27500 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
27510 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
27520 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
27530 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
27540 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20   *zTmpname = 0; 
27550 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  /* For temporary
27560 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65   filename, if ne
27570 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69  cessary. */..  i
27580 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27590 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
275a0 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
275b0 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65   Code */.#if !de
275c0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
275d0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
275e0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
275f0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
27600 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
27610 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
27620 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  dif..  int isExc
27630 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
27640 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
27650 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
27660 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
27670 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
27680 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
27690 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
276a0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
276b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
276c0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
276d0 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
276e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
276f0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
27700 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
27710 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
27720 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
27730 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
27740 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  UG.  int isOpenJ
27750 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
27760 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
27770 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
27780 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
27790 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  L.     || eType=
277a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
277b0 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c  N_JOURNAL.     |
277c0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
277d0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23  OPEN_WAL.  ));.#
277e0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
277f0 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
27800 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73   pFile=%p, flags
27810 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  =%x, pOutFlags=%
27820 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
27830 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20   zUtf8Name, id, 
27840 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  flags, pOutFlags
27850 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ));..  /* Check 
27860 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
27870 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
27880 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  e:.  **.  **   (
27890 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
278a0 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
278b0 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
278c0 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
278d0 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  and.  **   (b) i
278e0 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
278f0 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
27900 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
27910 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
27920 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
27930 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
27940 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
27950 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
27960 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
27970 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
27980 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
27990 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
279a0 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
279b0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
279c0 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
279d0 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
279e0 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
279f0 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
27a00 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
27a10 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
27a20 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
27a30 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
27a40 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
27a50 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
27a60 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
27a70 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
27a80 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
27a90 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a  al are never.  *
27aa0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
27ab0 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
27ac0 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
27ad0 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
27ae0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
27af0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
27b00 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
27b10 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
27b20 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
27b30 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
27b40 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
27b50 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
27b60 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
27b70 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
27b80 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
27b90 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
27ba0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
27bb0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
27bc0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
27bd0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
27be0 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
27bf0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
27c00 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
27c10 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
27c20 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
27c30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
27c40 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
27c50 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
27c60 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
27c70 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20 20  EN_TEMP_DB.     
27c80 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
27c90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
27ca0 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
27cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
27cc0 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c  JOURNAL.       |
27cd0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
27ce0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
27cf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
27d00 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
27d10 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c  OURNAL.       ||
27d20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
27d30 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
27d40 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27d50 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
27d60 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
27d70 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  !=0 );.  memset(
27d80 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
27d90 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46  (winFile));.  pF
27da0 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  ile->h = INVALID
27db0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a  _HANDLE_VALUE;..
27dc0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
27dd0 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38  NRT.  if( !zUtf8
27de0 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33  Name && !sqlite3
27df0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
27e00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
27e10 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  og(SQLITE_ERROR,
27e20 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65  .        "sqlite
27e30 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
27e40 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
27e50 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52   be set for WinR
27e60 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T");.  }.#endif.
27e70 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
27e80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
27e90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27ea0 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
27eb0 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
27ec0 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73   file name to us
27ed0 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55  e.  */.  if( !zU
27ee0 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
27ef0 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20  ssert( isDelete 
27f00 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
27f10 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  l );.    rc = wi
27f20 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  nGetTempname(pVf
27f30 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  s, &zTmpname);. 
27f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  E_OK ){.      OS
27f60 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
27f70 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55  e=%s, rc=%s", zU
27f80 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  tf8Name, sqlite3
27f90 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
27fa0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
27fb0 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
27fc0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
27fd0 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
27fe0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
27ff0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
28000 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
28010 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
28020 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
28030 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
28040 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
28050 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
28060 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
28070 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
28080 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
28090 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
280a0 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
280b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
280c0 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38   ||.       zUtf8
280d0 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  Name[sqlite3Strl
280e0 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b  en30(zUtf8Name)+
280f0 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  1]==0 );..  /* C
28100 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
28110 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
28120 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
28130 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
28140 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
28150 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
28160 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
28170 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
28180 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
28190 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
281a0 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
281b0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
281c0 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66  ERR_NOMEM", zUtf
281d0 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
281e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
281f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
28200 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72  ..  if( winIsDir
28210 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
28220 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28230 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28240 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28250 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
28260 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
28270 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
28280 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c  CANTOPEN_ISDIR",
28290 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20   zUtf8Name));.  
282a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
282b0 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a  CANTOPEN_ISDIR;.
282c0 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61    }..  if( isRea
282d0 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77  dWrite ){.    dw
282e0 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
282f0 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
28300 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20  ENERIC_WRITE;.  
28310 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73  }else{.    dwDes
28320 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
28330 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  ERIC_READ;.  }..
28340 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    /* SQLITE_OPEN
28350 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73  _EXCLUSIVE is us
28360 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
28370 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20  that a new file 
28380 69 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  is.  ** created.
28390 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
283a0 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
283b0 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
283c0 63 65 73 73 22 0a 20 20 2a 2a 20 61 73 20 69 74  cess".  ** as it
283d0 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65   is usually unde
283e0 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69  rstood..  */.  i
283f0 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
28400 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73  {.    /* Creates
28410 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c   a new file, onl
28420 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  y if it does not
28430 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
28440 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  */.    /* If the
28450 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74   file exists, it
28460 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64   fails. */.    d
28470 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
28480 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45  tion = CREATE_NE
28490 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  W;.  }else if( i
284a0 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f  sCreate ){.    /
284b0 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20  * Open existing 
284c0 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20  file, or create 
284d0 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  if it doesn't ex
284e0 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ist */.    dwCre
284f0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
28500 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
28510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
28520 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e  Opens a file, on
28530 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ly if it exists.
28540 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
28550 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
28560 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20  OPEN_EXISTING;. 
28570 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64   }..  dwShareMod
28580 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52  e = FILE_SHARE_R
28590 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45  EAD | FILE_SHARE
285a0 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69  _WRITE;..  if( i
285b0 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53  sDelete ){.#if S
285c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
285d0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
285e0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
285f0 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b  TTRIBUTE_HIDDEN;
28600 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b  .    isTemp = 1;
28610 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61  .#else.    dwFla
28620 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
28630 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
28640 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20  _TEMPORARY.     
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
28670 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
28680 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286a0 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c   | FILE_FLAG_DEL
286b0 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65  ETE_ON_CLOSE;.#e
286c0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
286d0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
286e0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
286f0 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a  TRIBUTE_NORMAL;.
28700 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73    }.  /* Reports
28710 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
28720 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66  et are that perf
28730 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79  ormance is alway
28740 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66  s.  ** better if
28750 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
28760 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64  M_ACCESS is used
28770 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e  .  Ticket #2699.
28780 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
28790 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67  S_WINCE.  dwFlag
287a0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c  sAndAttributes |
287b0 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
287c0 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69  OM_ACCESS;.#endi
287d0 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  f..  if( osIsNT(
287e0 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
287f0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45  OS_WINRT.    CRE
28800 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
28810 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78 74  D_PARAMETERS ext
28820 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b  endedParameters;
28830 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
28840 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d  ameters.dwSize =
28850 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49   sizeof(CREATEFI
28860 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
28870 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78  AMETERS);.    ex
28880 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
28890 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
288a0 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s =.            
288b0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
288c0 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52  utes & FILE_ATTR
288d0 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20  IBUTE_MASK;.    
288e0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
288f0 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d  rs.dwFileFlags =
28900 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
28910 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41  butes & FILE_FLA
28920 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  G_MASK;.    exte
28930 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
28940 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67  wSecurityQosFlag
28950 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f  s = SECURITY_ANO
28960 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65  NYMOUS;.    exte
28970 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c  ndedParameters.l
28980 70 53 65 63 75 72 69 74 79 41 74 74 72 69 62 75  pSecurityAttribu
28990 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tes = NULL;.    
289a0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
289b0 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65  rs.hTemplateFile
289c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 7b   = NULL;.    do{
289d0 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72 65  .      h = osCre
289e0 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54  ateFile2((LPCWST
289f0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
28a20 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
28a40 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20  wShareMode,.    
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
28a70 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61     &extendedPara
28aa0 6d 65 74 65 72 73 29 3b 0a 20 20 20 20 20 20 69  meters);.      i
28ab0 66 28 20 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h!=INVALID_HA
28ac0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20 62 72 65  NDLE_VALUE ) bre
28ad0 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ak;.      if( is
28ae0 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
28af0 20 20 20 20 20 69 6e 74 20 72 63 32 2c 20 69 73       int rc2, is
28b00 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  RO = 0;.        
28b10 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
28b20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
28b30 20 20 20 20 72 63 32 20 3d 20 77 69 6e 41 63 63      rc2 = winAcc
28b40 65 73 73 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  ess(pVfs, zName,
28b50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
28b60 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a 20 20 20  EAD, &isRO);.   
28b70 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
28b80 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
28b90 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
28ba0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 52  SQLITE_OK && isR
28bb0 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  O ) break;.     
28bc0 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 77   }.    }while( w
28bd0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
28be0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
28bf0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 6f 7b 0a  ;.#else.    do{.
28c00 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72 65 61        h = osCrea
28c10 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
28c20 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
28c50 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
28c70 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
28c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28c90 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
28ca0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
28cd0 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20        NULL);.   
28d00 20 20 20 69 66 28 20 68 21 3d 49 4e 56 41 4c 49     if( h!=INVALI
28d10 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
28d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
28d30 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
28d40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 32  .        int rc2
28d50 2c 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20  , isRO = 0;.    
28d60 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
28d70 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
28d80 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 77 69          rc2 = wi
28d90 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e  nAccess(pVfs, zN
28da0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ame, SQLITE_ACCE
28db0 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b  SS_READ, &isRO);
28dc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28dd0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
28de0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28df0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  c2==SQLITE_OK &&
28e00 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20   isRO ) break;. 
28e10 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
28e20 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  e( winRetryIoerr
28e30 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
28e40 6f 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  o) );.#endif.  }
28e50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
28e60 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
28e70 65 6c 73 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20  else{.    do{.  
28e80 20 20 20 20 68 20 3d 20 6f 73 43 72 65 61 74 65      h = osCreate
28e90 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43  FileA((LPCSTR)zC
28ea0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
28ed0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
28ee0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
28ef0 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f10 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
28f20 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
28f50 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
28f80 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44 5f 48  if( h!=INVALID_H
28f90 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20 62 72  ANDLE_VALUE ) br
28fa0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  eak;.      if( i
28fb0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
28fc0 20 20 20 20 20 20 69 6e 74 20 72 63 32 2c 20 69        int rc2, i
28fd0 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sRO = 0;.       
28fe0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
28ff0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
29000 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e 41 63       rc2 = winAc
29010 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61 6d 65  cess(pVfs, zName
29020 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
29030 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a 20 20  READ, &isRO);.  
29040 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
29050 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
29060 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d          if( rc2=
29070 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73  =SQLITE_OK && is
29080 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  RO ) break;.    
29090 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
290a0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
290b0 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
290c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
290d0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c  winLogIoerr(cnt,
290e0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20 20 4f   __LINE__);..  O
290f0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69  STRACE(("OPEN fi
29100 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20  le=%p, name=%s, 
29110 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25  access=%lx, rc=%
29120 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61  s\n", h, zUtf8Na
29130 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64  me,.           d
29140 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
29150 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  (h==INVALID_HAND
29160 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69  LE_VALUE) ? "fai
29170 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
29180 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44    if( h==INVALID
29190 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
291a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
291b0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
291c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
291d0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
291e0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
291f0 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
29200 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
29210 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
29220 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20  me, id,.        
29230 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
29240 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
29250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29260 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
29270 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
29280 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
29290 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
292a0 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
292b0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
292c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
292d0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69  tErrno;.      wi
292e0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
292f0 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65  _CANTOPEN, pFile
29300 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  ->lastErrno, "wi
29310 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d  nOpen", zUtf8Nam
29320 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
29330 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
29340 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
29350 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
29360 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
29370 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
29380 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
29390 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
293a0 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
293b0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
293c0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
293d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
293e0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
293f0 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
29400 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
29410 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
29420 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
29430 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
29440 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
29450 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
29460 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
29470 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
29480 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
29490 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
294a0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
294b0 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
294c0 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 70 41 70 70   "ok"));..  pApp
294d0 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41 70  Data = (winVfsAp
294e0 70 44 61 74 61 2a 29 70 56 66 73 2d 3e 70 41 70  pData*)pVfs->pAp
294f0 70 44 61 74 61 3b 0a 0a 23 69 66 20 53 51 4c 49  pData;..#if SQLI
29500 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 0a  TE_OS_WINCE.  {.
29510 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
29520 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51  ite && eType==SQ
29530 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
29540 42 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  B.         && ((
29550 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c 29 20  pAppData==NULL) 
29560 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e 62 4e  || !pAppData->bN
29570 6f 4c 6f 63 6b 29 0a 20 20 20 20 20 20 20 20 20  oLock).         
29580 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43 72  && (rc = winceCr
29590 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20  eateLock(zName, 
295a0 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f  pFile))!=SQLITE_
295b0 4f 4b 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OK.    ){.      
295c0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29  osCloseHandle(h)
295d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
295e0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
295f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29600 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
29610 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
29620 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d  OPEN-CE-LOCK nam
29630 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
29640 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  zName, sqlite3Er
29650 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
29660 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29670 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
29680 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
29690 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
296a0 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
296b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
296c0 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   {.    sqlite3_f
296d0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
296e0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
296f0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
29700 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
29710 20 3d 20 70 41 70 70 44 61 74 61 20 3f 20 70 41   = pAppData ? pA
29720 70 70 44 61 74 61 2d 3e 70 4d 65 74 68 6f 64 20  ppData->pMethod 
29730 3a 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  : &winIoMethod;.
29740 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20    pFile->pVfs = 
29750 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  pVfs;.  pFile->h
29760 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65   = h;.  if( isRe
29770 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46  adonly ){.    pF
29780 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
29790 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  = WINFILE_RDONLY
297a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
297b0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
297c0 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53  zName, "psow", S
297d0 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
297e0 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
297f0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
29800 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53  gs |= WINFILE_PS
29810 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  OW;.  }.  pFile-
29820 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f  >lastErrno = NO_
29830 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e  ERROR;.  pFile->
29840 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
29850 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
29860 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c  AP_SIZE>0.  pFil
29870 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
29880 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
29890 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ion = 0;.  pFile
298a0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
298b0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
298c0 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
298d0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
298e0 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65  p;.#endif..  Ope
298f0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
29900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29910 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
29920 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
29930 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
29940 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
29950 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
29960 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
29970 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
29980 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
29990 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
299a0 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
299b0 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
299c0 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
299d0 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
299e0 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
299f0 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
29a00 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
29a10 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
29a20 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
29a30 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
29a40 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
29a50 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
29a60 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
29a70 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
29a80 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
29a90 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
29aa0 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
29ab0 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
29ac0 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
29ad0 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
29ae0 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
29af0 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
29b00 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
29b10 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
29b20 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
29b30 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
29b40 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
29b50 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
29b60 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
29b70 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
29b80 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
29b90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
29ba0 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
29bb0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bd0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
29be0 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
29bf0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
29c00 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
29c10 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
29c20 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
29c30 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
29c40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29c50 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
29c60 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
29c70 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
29c80 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
29c90 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
29ca0 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
29cb0 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
29cc0 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a  syncDir=%d\n", z
29cd0 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69  Filename, syncDi
29ce0 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  r));..  zConvert
29cf0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
29d00 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
29d10 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
29d20 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
29d30 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
29d40 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
29d50 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
29d60 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
29d70 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
29d80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29d90 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
29da0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
29db0 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53  {.    do {.#if S
29dc0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
29dd0 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f       WIN32_FILE_
29de0 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
29df0 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20  AttrData;.      
29e00 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
29e10 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
29e20 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  trData));.      
29e30 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74  if ( osGetFileAt
29e40 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e  tributesExW(zCon
29e50 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45  verted, GetFileE
29e60 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e90 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a   &sAttrData) ){.
29ea0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
29eb0 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
29ec0 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
29ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29ee0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
29ef0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
29f00 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
29f10 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
29f20 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
29f30 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
29f40 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
29f50 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
29f60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
29f70 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
29f80 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
29f90 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
29fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29fb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
29fc0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
29fd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29fe0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
29ff0 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
2a000 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
2a010 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
2a020 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d        if ( attr=
2a030 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
2a040 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20  TRIBUTES ){.    
2a050 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
2a060 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2a070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
2a080 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
2a090 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
2a0a0 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
2a0b0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
2a0c0 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
2a0d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a0e0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
2a0f0 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
2a100 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
2a110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a120 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a130 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
2a140 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a160 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54   ( attr&FILE_ATT
2a170 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
2a180 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a190 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
2a1a0 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f  * Files only. */
2a1b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a1d0 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57   ( osDeleteFileW
2a1e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
2a1f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a200 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74  ITE_OK; /* Delet
2a210 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20  ed OK. */.      
2a220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a230 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e  .      if ( !win
2a240 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
2a250 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
2a260 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a270 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
2a280 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
2a290 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
2a2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
2a2b0 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66  hile(1);.  }.#if
2a2c0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2a2d0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
2a2e0 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
2a2f0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
2a300 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f  eAttributesA(zCo
2a310 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2a320 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c  if ( attr==INVAL
2a330 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
2a340 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  ES ){.        la
2a350 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
2a360 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
2a370 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
2a380 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
2a390 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
2a3a0 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
2a3b0 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
2a3c0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
2a3d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2a3e0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
2a3f0 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
2a400 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
2a410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
2a420 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2a430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a450 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
2a460 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
2a470 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
2a480 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a490 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
2a4a0 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
2a4b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a4c0 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
2a4d0 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
2a4e0 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
2a4f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2a500 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
2a510 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
2a520 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2a530 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49   if ( !winRetryI
2a540 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
2a550 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
2a560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2a570 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20  ROR; /* No more 
2a580 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20  retries. */.    
2a590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a5a0 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31   }.    } while(1
2a5b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2a5c0 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53 51  if( rc && rc!=SQ
2a5d0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2a5e0 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72  E_NOENT ){.    r
2a5f0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
2a600 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2a610 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ETE, lastErrno, 
2a620 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69  "winDelete", zFi
2a630 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
2a640 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72  {.    winLogIoer
2a650 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  r(cnt, __LINE__)
2a660 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2a670 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2a680 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
2a690 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LETE name=%s, rc
2a6a0 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%s\n", zFilenam
2a6b0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
2a6c0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
2a6d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
2a6e0 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e  heck the existen
2a6f0 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66  ce and status of
2a700 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
2a710 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73  ic int winAccess
2a720 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2a730 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f  *pVfs,         /
2a740 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
2a750 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
2a760 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2a770 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
2a780 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
2a790 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a7b0 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20  Type of test to 
2a7c0 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c  make on this fil
2a7d0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  e */.  int *pRes
2a7e0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
2a7f0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74    /* OUT: Result
2a800 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61   */.){.  DWORD a
2a810 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
2a820 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
2a830 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
2a840 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
2a850 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a860 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c  (pVfs);..  Simul
2a870 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2a880 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2a890 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54  ACCESS; );.  OST
2a8a0 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61  RACE(("ACCESS na
2a8b0 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c  me=%s, flags=%x,
2a8c0 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a   pResOut=%p\n",.
2a8d0 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
2a8e0 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65  name, flags, pRe
2a8f0 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76  sOut));..  zConv
2a900 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
2a910 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
2a920 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
2a930 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
2a940 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2a950 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
2a960 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
2a970 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
2a980 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
2a990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2a9a0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2a9b0 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
2a9c0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
2a9d0 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
2a9e0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
2a9f0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
2aa00 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
2aa10 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
2aa20 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
2aa30 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
2aa40 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
2aa50 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
2aa60 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa80 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
2aa90 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
2aac0 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52  trData)) && winR
2aad0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
2aae0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
2aaf0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ab00 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51      /* For an SQ
2ab10 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2ab20 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20  TS query, treat 
2ab30 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69  a zero-length fi
2ab40 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  le.      ** as i
2ab50 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
2ab60 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2ab70 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73      if(    flags
2ab80 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
2ab90 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20  EXISTS.         
2aba0 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
2abb0 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20  ileSizeHigh==0. 
2abc0 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
2abd0 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
2abe0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
2abf0 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
2ac00 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
2ac10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ac20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
2ac30 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
2ac40 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
2ac50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ac60 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
2ac70 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  t, __LINE__);.  
2ac80 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
2ac90 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o!=ERROR_FILE_NO
2aca0 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45  T_FOUND && lastE
2acb0 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48  rrno!=ERROR_PATH
2acc0 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
2acd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ace0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2acf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
2ad00 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
2ad10 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
2ad20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
2ad30 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20  ccess",.        
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad50 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
2ad60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ad70 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
2ad80 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
2ad90 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
2ada0 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
2adb0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
2adc0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
2add0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
2ade0 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
2adf0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
2ae00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
2ae10 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2ae20 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
2ae30 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
2ae40 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
2ae50 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
2ae60 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2ae70 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
2ae80 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
2ae90 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
2aea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aeb0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2aec0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
2aed0 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
2aee0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
2aef0 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
2af00 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
2af10 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
2af20 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
2af30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
2af40 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
2af50 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
2af60 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
2af70 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
2af80 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  rc;.  OSTRACE(("
2af90 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
2afa0 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
2afb0 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
2afc0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
2afd0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
2afe0 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
2aff0 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
2b000 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2b010 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
2b020 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
2b030 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74  ied path name st
2b040 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
2b050 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c  e letter.** foll
2b060 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20  owed by a colon 
2b070 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
2b080 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
2b090 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
2b0a0 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on(.  const char
2b0b0 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
2b0c0 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65   return ( sqlite
2b0d0 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61  3Isalpha(zPathna
2b0e0 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e  me[0]) && zPathn
2b0f0 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d  ame[1]==':' );.}
2b100 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
2b110 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2b120 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
2b130 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
2b140 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
2b150 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
2b160 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
2b170 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
2b180 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2b190 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
2b1a0 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
2b1b0 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
2b1c0 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
2b1d0 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
2b1e0 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
2b1f0 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
2b200 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
2b210 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
2b220 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
2b230 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
2b240 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
2b250 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b260 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
2b270 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
2b280 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
2b290 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
2b2a0 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
2b2b0 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
2b2c0 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
2b2d0 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
2b2e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
2b2f0 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
2b300 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
2b310 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
2b320 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
2b330 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
2b340 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
2b350 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
2b360 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
2b370 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
2b380 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
2b390 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
2b3a0 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
2b3b0 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
2b3c0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2b3d0 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
2b3e0 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
2b3f0 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
2b400 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b  irSep(zPathname[
2b410 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0]) ){.    retur
2b420 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
2b430 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
2b440 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
2b450 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
2b460 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
2b470 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
2b480 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
2b490 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
2b4a0 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
2b4b0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2b4c0 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
2b4d0 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
2b4e0 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
2b4f0 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
2b500 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
2b510 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
2b520 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
2b530 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76    if ( winIsDriv
2b540 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
2b550 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20  zPathname) ){.  
2b560 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
2b570 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
2b580 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20   we get to this 
2b590 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20  point, the path 
2b5a0 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f  name should almo
2b5b0 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20  st certainly be 
2b5c0 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65  a purely.  ** re
2b5d0 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e  lative one (i.e.
2b5e0 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c   not a UNC name,
2b5f0 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61   not absolute, a
2b600 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65  nd not volume re
2b610 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20  lative)..  */.  
2b620 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
2b630 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
2b640 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
2b650 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
2b660 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
2b670 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
2b680 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
2b690 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
2b6a0 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
2b6b0 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
2b6c0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
2b6d0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
2b6e0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
2b6f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2b700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2b710 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2b720 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2b730 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
2b740 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
2b750 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
2b760 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
2b770 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
2b780 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b790 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
2b7a0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
2b7b0 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b7d0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
2b7e0 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45  /.){.#if !SQLITE
2b7f0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
2b800 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2b810 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
2b820 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42  IN__).  DWORD nB
2b830 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  yte;.  void *zCo
2b840 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20  nverted;.  char 
2b850 2a 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  *zOut;.#endif.. 
2b860 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
2b870 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
2b880 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
2b890 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
2b8a0 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
2b8b0 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
2b8c0 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
2b8d0 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
2b8e0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
2b8f0 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
2b900 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
2b910 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69  AndColon(zRelati
2b920 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65  ve+1) ){.    zRe
2b930 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 23  lative++;.  }..#
2b940 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
2b950 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
2b960 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2b970 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
2b980 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b990 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
2b9a0 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
2b9b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
2b9c0 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
2b9d0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
2b9e0 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
2b9f0 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
2ba00 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
2ba10 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
2ba20 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2ba30 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
2ba40 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
2ba50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
2ba60 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2ba70 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
2ba80 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
2ba90 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
2baa0 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
2bab0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
2bac0 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
2bad0 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
2bae0 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
2baf0 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
2bb00 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
2bb10 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
2bb20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
2bb30 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2bb40 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
2bb50 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
2bb60 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
2bb70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2bb80 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2bb90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67     }.    if( cyg
2bba0 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
2bbb0 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49 73             (osIs
2bbc0 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58  NT() ? CCP_POSIX
2bbd0 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f  _TO_WIN_W : CCP_
2bbe0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20  POSIX_TO_WIN_A) 
2bbf0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 43  |.            CC
2bc00 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c  P_RELATIVE, zRel
2bc10 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66  ative, zOut, pVf
2bc20 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
2bc30 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
2bc40 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
2bc50 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2bc60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2bc70 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
2bc80 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c  H, (DWORD)errno,
2bc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bca0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
2bcb0 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
2bcc0 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65  elative);.    }e
2bcd0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
2bce0 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76  *zUtf8 = winConv
2bcf0 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
2bd00 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  e(zOut);.      i
2bd10 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20  f( !zUtf8 ){.   
2bd20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bd30 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  e(zOut);.       
2bd40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2bd50 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2bd60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2bd70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2bd80 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2bd90 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2bda0 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
2bdd0 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
2bde0 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55  nGetDirSep(), zU
2bdf0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
2be00 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
2be10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2be20 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
2be30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
2be40 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
2be50 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
2be60 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2be70 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
2be80 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
2be90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
2bea0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2beb0 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
2bec0 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
2bed0 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
2bee0 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
2bef0 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
2bf00 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20  X_TO_WIN_A),.   
2bf10 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69           zRelati
2bf20 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e  ve, zOut, pVfs->
2bf30 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
2bf40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2bf50 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
2bf60 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2bf70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2bf80 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
2bf90 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfb0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2bfc0 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
2bfd0 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tive);.    }else
2bfe0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
2bff0 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
2c000 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
2c010 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
2c020 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
2c030 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c040 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
2c050 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2c060 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2c070 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2c080 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
2c090 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
2c0a0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
2c0b0 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
2c0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c0d0 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ee(zUtf8);.     
2c0e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
2c0f0 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ut);.    }.  }. 
2c100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c110 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28  K;.#endif..#if (
2c120 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
2c130 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
2c140 52 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  RT) && !defined(
2c150 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
2c160 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2c170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2c180 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  OR );.  /* WinCE
2c190 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
2c1a0 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
2c1b0 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
2c1c0 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a  am told. */.  /*
2c1d0 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61   WinRT has no wa
2c1e0 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72  y to convert a r
2c1f0 65 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20  elative path to 
2c200 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e  an absolute one.
2c210 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74   */.  if ( sqlit
2c220 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2c230 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
2c240 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
2c250 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
2c260 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
2c270 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2c280 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
2c290 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
2c2a0 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
2c2b0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
2c2c0 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
2c2d0 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
2c2e0 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
2c2f0 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
2c300 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
2c310 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
2c320 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
2c330 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
2c340 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
2c350 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
2c360 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20   a backslash..  
2c370 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2c380 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
2c390 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
2c3a0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
2c3b0 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%c%s",.       
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c3d0 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2c3e0 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53  tory, winGetDirS
2c3f0 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29  ep(), zRelative)
2c400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2c410 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c420 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2c430 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2c440 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61  ull, "%s", zRela
2c450 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tive);.  }.  ret
2c460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2c470 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
2c480 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
2c490 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2c4a0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
2c4b0 47 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49 74 27  GWIN__).  /* It'
2c4c0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2c4d0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2c4e0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2c4f0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2c500 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2c510 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2c520 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2c530 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2c540 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2c550 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
2c560 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
2c570 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
2c580 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
2c590 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
2c5a0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2c5b0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
2c5c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2c5d0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2c5e0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28  _ERROR );.  if (
2c5f0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
2c600 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
2c610 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
2c620 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
2c630 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
2c640 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
2c650 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
2c660 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
2c670 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
2c680 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
2c690 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
2c6a0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
2c6b0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
2c6c0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
2c6d0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
2c6e0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2c6f0 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
2c700 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
2c710 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
2c720 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
2c730 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
2c740 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
2c750 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c760 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2c770 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2c780 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
2c7b0 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
2c7c0 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
2c7d0 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75  ative);.    retu
2c7e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c7f0 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  }.  zConverted =
2c800 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
2c810 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c  tf8Filename(zRel
2c820 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43  ative);.  if( zC
2c830 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
2c840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c850 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2c860 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  T;.  }.  if( osI
2c870 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
2c880 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
2c890 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2c8a0 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
2c8b0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
2c8c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
2c8d0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
2c8e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c8f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2c900 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2c910 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2c920 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
2c930 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2c940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c950 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2c960 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
2c970 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2c980 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
2c990 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
2c9a0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2c9b0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
2c9c0 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
2c9d0 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
2c9e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c9f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2ca00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ca10 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2ca20 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  PT;.    }.    nB
2ca30 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2ca40 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
2ca50 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  R)zConverted, nB
2ca60 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
2ca70 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
2ca80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ca90 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2caa0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2cab0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2cac0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2cad0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2cae0 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
2caf0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
2cb00 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
2cb20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c  nFullPathname2",
2cb30 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2cb40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2cb50 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
2cb60 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55  .    zOut = winU
2cb70 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
2cb80 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
2cb90 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2cba0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2cbb0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
2cbc0 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
2cbd0 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
2cbe0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
2cbf0 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
2cc00 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
2cc10 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2cc20 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2cc30 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2cc40 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
2cc50 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2cc60 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2cc70 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
2cc80 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
2ccb0 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74  thname3", zRelat
2ccc0 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
2ccd0 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20  nByte += 3;.    
2cce0 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d  zTemp = sqlite3M
2ccf0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
2cd00 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
2cd10 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
2cd20 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
2cd30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2cd40 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2cd50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2cd60 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2cd70 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
2cd80 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
2cd90 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
2cda0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
2cdb0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
2cdc0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
2cdd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2cde0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2cdf0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ce00 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
2ce10 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2ce20 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2ce30 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
2ce40 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce60 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
2ce70 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74  thname4", zRelat
2ce80 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
2ce90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2cea0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
2ceb0 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74  ut = winMbcsToUt
2cec0 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46  f8(zTemp, osAreF
2ced0 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
2cee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2cef0 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e  (zTemp);.  }.#en
2cf00 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29  dif.  if( zOut )
2cf10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2cf20 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
2cf30 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
2cf40 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
2cf50 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
2cf60 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2cf70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cf80 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2cf90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cfa0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2cfb0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  PT;.  }.#endif.}
2cfc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2cfd0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2cfe0 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
2cff0 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
2d000 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
2d010 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
2d020 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
2d030 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
2d040 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
2d050 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
2d060 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  brary..*/.static
2d070 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e   void *winDlOpen
2d080 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2d090 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
2d0a0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41  zFilename){.  HA
2d0b0 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69  NDLE h;.#if defi
2d0c0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
2d0d0 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56    int nFull = pV
2d0e0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2d0f0 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  ;.  char *zFull 
2d100 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
2d110 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20  ero( nFull );.  
2d120 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
2d130 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c   = 0;.  if( zFul
2d140 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  l==0 ){.    OSTR
2d150 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2d160 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2d170 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2d180 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72  void*)0));.    r
2d190 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
2d1a0 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  f( winFullPathna
2d1b0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2d1c0 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c  me, nFull, zFull
2d1d0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
2d1e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2d1f0 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54  (zFull);.    OST
2d200 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2d210 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2d220 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2d230 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
2d240 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2d250 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
2d260 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
2d270 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a  ilename(zFull);.
2d280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d290 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76  Full);.#else.  v
2d2a0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
2d2b0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
2d2c0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
2d2d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45  lename);.  UNUSE
2d2e0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2d2f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
2d300 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
2d310 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
2d320 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
2d330 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
2d340 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
2d350 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
2d360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
2d370 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
2d380 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
2d390 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  h = osLoadPackag
2d3a0 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53  edLibrary((LPCWS
2d3b0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
2d3c0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  );.#else.    h =
2d3d0 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   osLoadLibraryW(
2d3e0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
2d3f0 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
2d400 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
2d410 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
2d420 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73  else{.    h = os
2d430 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68  LoadLibraryA((ch
2d440 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
2d450 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
2d460 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2d470 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2d480 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2d490 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73   (void*)h));.  s
2d4a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2d4b0 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
2d4c0 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
2d4d0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
2d4e0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2d4f0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2d500 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
2d510 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d520 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69  ETER(pVfs);.  wi
2d530 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
2d540 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
2d550 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  ), nBuf, zBufOut
2d560 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2d570 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69   (*winDlSym(sqli
2d580 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f  te3_vfs *pVfs,vo
2d590 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61  id *pH,const cha
2d5a0 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  r *zSym))(void){
2d5b0 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b  .  FARPROC proc;
2d5c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d5d0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f  TER(pVfs);.  pro
2d5e0 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64  c = osGetProcAdd
2d5f0 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48  ressA((HANDLE)pH
2d600 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41  , zSym);.  OSTRA
2d610 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c  CE(("DLSYM handl
2d620 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c  e=%p, symbol=%s,
2d630 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a   address=%p\n",.
2d640 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
2d650 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69  *)pH, zSym, (voi
2d660 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74  d*)proc));.  ret
2d670 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69  urn (void(*)(voi
2d680 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69  d))proc;.}.stati
2d690 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  c void winDlClos
2d6a0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
2d6b0 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
2d6c0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
2d6d0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2d6e0 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28   osFreeLibrary((
2d6f0 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
2d700 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43  .  OSTRACE(("DLC
2d710 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  LOSE handle=%p\n
2d720 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c  ", (void*)pHandl
2d730 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  e));.}.#else /* 
2d740 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
2d750 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
2d760 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
2d770 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
2d780 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
2d790 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
2d7a0 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
2d7b0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2d7c0 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
2d7d0 0a 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d  ./* State inform
2d7e0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 61  ation for the ra
2d7f0 6e 64 6f 6d 6e 65 73 73 20 67 61 74 68 65 72 65  ndomness gathere
2d800 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r. */.typedef st
2d810 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68  ruct EntropyGath
2d820 65 72 65 72 20 45 6e 74 72 6f 70 79 47 61 74 68  erer EntropyGath
2d830 65 72 65 72 3b 0a 73 74 72 75 63 74 20 45 6e 74  erer;.struct Ent
2d840 72 6f 70 79 47 61 74 68 65 72 65 72 20 7b 0a 20  ropyGatherer {. 
2d850 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d860 61 3b 20 20 20 2f 2a 20 47 61 74 68 65 72 20 65  a;   /* Gather e
2d870 6e 74 72 6f 70 79 20 69 6e 74 6f 20 74 68 69 73  ntropy into this
2d880 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
2d890 20 6e 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   na;            
2d8a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20   /* Size of a[] 
2d8b0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
2d8c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2d8d0 20 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69 6e    /* XOR next in
2d8e0 70 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a 2f  put into a[i] */
2d8f0 0a 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20 20  .  int nXor;    
2d900 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d910 20 6f 66 20 58 4f 52 20 6f 70 65 72 61 74 69 6f   of XOR operatio
2d920 6e 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23  ns done */.};..#
2d930 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2d940 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66  TE_TEST) && !def
2d950 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2d960 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a 20  _RANDOMNESS)./* 
2d970 4d 69 78 20 73 7a 20 62 79 74 65 73 20 6f 66 20  Mix sz bytes of 
2d980 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e 20  entropy into p. 
2d990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78  */.static void x
2d9a0 6f 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70 79  orMemory(Entropy
2d9b0 47 61 74 68 65 72 65 72 20 2a 70 2c 20 75 6e 73  Gatherer *p, uns
2d9c0 69 67 6e 65 64 20 63 68 61 72 20 2a 78 2c 20 69  igned char *x, i
2d9d0 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a 2c  nt sz){.  int j,
2d9e0 20 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6b   k;.  for(j=0, k
2d9f0 3d 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b  =p->i; j<sz; j++
2da00 29 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b 5d  ){.    p->a[k++]
2da10 20 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69 66   ^= x[j];.    if
2da20 28 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20 3d  ( k>=p->na ) k =
2da30 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20 3d   0;.  }.  p->i =
2da40 20 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b 3d   k;.  p->nXor +=
2da50 20 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   sz;.}.#endif /*
2da60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2da70 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
2da80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2da90 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a 2f  ANDOMNESS) */../
2daa0 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
2dab0 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
2dac0 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
2dad0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2dae0 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
2daf0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2db00 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
2db10 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20 64  ar *zBuf){.#if d
2db20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2db30 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
2db40 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f  QLITE_OMIT_RANDO
2db50 4d 4e 45 53 53 29 0a 20 20 55 4e 55 53 45 44 5f  MNESS).  UNUSED_
2db60 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2db70 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
2db80 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65 74 75  0, nBuf);.  retu
2db90 72 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a 20  rn nBuf;.#else. 
2dba0 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72   EntropyGatherer
2dbb0 20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   e;.  UNUSED_PAR
2dbc0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2dbd0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
2dbe0 6e 42 75 66 29 3b 0a 20 20 65 2e 61 20 3d 20 28  nBuf);.  e.a = (
2dbf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
2dc00 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e 42  Buf;.  e.na = nB
2dc10 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d 20 30  uf;.  e.nXor = 0
2dc20 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20 20 7b  ;.  e.i = 0;.  {
2dc30 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20  .    SYSTEMTIME 
2dc40 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74  x;.    osGetSyst
2dc50 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20  emTime(&x);.    
2dc60 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2dc70 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 78  nsigned char*)&x
2dc80 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  , sizeof(SYSTEMT
2dc90 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20  IME));.  }.  {. 
2dca0 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f     DWORD pid = o
2dcb0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
2dcc0 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f 72 4d  ssId();.    xorM
2dcd0 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2dce0 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64 2c 20  ned char*)&pid, 
2dcf0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a  sizeof(DWORD));.
2dd00 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f    }.#if SQLITE_O
2dd10 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20  S_WINRT.  {.    
2dd20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20  ULONGLONG cnt = 
2dd30 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  osGetTickCount64
2dd40 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  ();.    xorMemor
2dd50 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2dd60 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65  char*)&cnt, size
2dd70 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29 3b 0a  of(ULONGLONG));.
2dd80 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
2dd90 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73    DWORD cnt = os
2dda0 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a  GetTickCount();.
2ddb0 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65      xorMemory(&e
2ddc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2ddd0 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 44  *)&cnt, sizeof(D
2dde0 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  WORD));.  }.#end
2ddf0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
2de00 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20 20 20  WINRT */.  {.   
2de10 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
2de20 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
2de30 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
2de40 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  &i);.    xorMemo
2de50 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2de60 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a 65 6f   char*)&i, sizeo
2de70 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29  f(LARGE_INTEGER)
2de80 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49  );.  }.#if !SQLI
2de90 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
2dea0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2deb0 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
2dec0 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20 20 20  USE_UUID.  {.   
2ded0 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d 65   UUID id;.    me
2dee0 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a  mset(&id, 0, siz
2def0 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20  eof(UUID));.    
2df00 6f 73 55 75 69 64 43 72 65 61 74 65 28 26 69 64  osUuidCreate(&id
2df10 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79  );.    xorMemory
2df20 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  (&e, (unsigned c
2df30 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66  har*)&id, sizeof
2df40 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d 65 6d  (UUID));.    mem
2df50 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65  set(&id, 0, size
2df60 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f  of(UUID));.    o
2df70 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  sUuidCreateSeque
2df80 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20 20 20  ntial(&id);.    
2df90 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2dfa0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69  nsigned char*)&i
2dfb0 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29  d, sizeof(UUID))
2dfc0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
2dfd0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2dfe0 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
2dff0 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
2e000 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20 2a 2f  IN32_USE_UUID */
2e010 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58 6f 72  .  return e.nXor
2e020 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a 20 65  >nBuf ? nBuf : e
2e030 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a  .nXor;.#endif /*
2e040 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2e050 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
2e060 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
2e070 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a 0a 0a  DOMNESS) */.}...
2e080 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
2e090 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
2e0a0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
2e0b0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
2e0c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e0d0 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
2e0e0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2e0f0 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c  microsec){.  sql
2e100 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
2e110 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
2e120 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f  1000);.  UNUSED_
2e130 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2e140 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72  .  return ((micr
2e150 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a  osec+999)/1000)*
2e160 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  1000;.}../*.** T
2e170 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2e180 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
2e190 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
2e1a0 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
2e1b0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
2e1c0 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
2e1d0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
2e1e0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
2e1f0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
2e200 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
2e210 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
2e220 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
2e230 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
2e240 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2e250 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
2e260 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
2e270 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
2e280 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
2e290 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2e2a0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2e2b0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2e2c0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2e2d0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
2e2e0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
2e2f0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
2e300 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
2e310 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
2e320 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
2e330 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
2e340 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
2e350 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
2e360 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
2e370 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
2e380 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
2e390 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
2e3a0 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
2e3b0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
2e3c0 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
2e3d0 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
2e3e0 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
2e3f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2e400 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
2e410 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
2e420 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a  time and date.**
2e430 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2e440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e450 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2e460 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
2e470 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
2e480 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
2e490 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
2e4a0 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
2e4b0 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
2e4c0 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
2e4d0 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  of.     100-nano
2e4e0 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
2e4f0 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
2e500 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
2e510 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20  5813.5)..  */.  
2e520 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
2e530 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2e540 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
2e550 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
2e560 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
2e570 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
2e580 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2e590 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2e5a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
2e5b0 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
2e5c0 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
2e5d0 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
2e5e0 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
2e5f0 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
2e600 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
2e610 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
2e620 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2e630 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
2e640 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c 69  ue =.      (sqli
2e650 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
2e660 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
2e670 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
2e680 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65   +.      (sqlite
2e690 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39  3_int64)29496729
2e6a0 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  6;..#if SQLITE_O
2e6b0 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d  S_WINCE.  SYSTEM
2e6c0 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47  TIME time;.  osG
2e6d0 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
2e6e0 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
2e6f0 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
2e700 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
2e710 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
2e720 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69   if (!osSystemTi
2e730 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
2e740 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
2e750 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2e760 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f  R;.  }.#else.  o
2e770 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  sGetSystemTimeAs
2e780 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
2e790 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
2e7a0 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
2e7b0 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
2e7c0 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
2e7d0 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
2e7e0 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
2e7f0 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20 20  Value) +.       
2e800 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2e810 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44  _int64)ft.dwLowD
2e820 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65  ateTime)/(sqlite
2e830 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a  3_int64)10000;..
2e840 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2e850 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
2e860 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
2e870 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
2e880 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
2e890 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
2e8a0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
2e8b0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
2e8c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e8d0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2e8e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e8f0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2e900 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2e910 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2e920 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2e930 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
2e940 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2e950 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2e960 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
2e970 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
2e980 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
2e990 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2e9a0 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
2e9b0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
2e9c0 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
2e9d0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
2e9e0 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  Vfs, double *prN
2e9f0 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ow){.  int rc;. 
2ea00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2ea10 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72  ;.  rc = winCurr
2ea20 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
2ea30 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72  s, &i);.  if( !r
2ea40 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  c ){.    *prNow 
2ea50 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
2ea60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ea70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64  .}../*.** The id
2ea80 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ea is that this 
2ea90 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c  function works l
2eaa0 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ike a combinatio
2eab0 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45  n of.** GetLastE
2eac0 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61  rror() and Forma
2ead0 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69  tMessage() on Wi
2eae0 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20  ndows (or errno 
2eaf0 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f  and.** strerror_
2eb00 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66  r() on Unix). Af
2eb10 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ter an error is 
2eb20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f  returned by an O
2eb30 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53  S.** function, S
2eb40 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
2eb50 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a   function with z
2eb60 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a  Buf pointing to.
2eb70 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e  ** a buffer of n
2eb80 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f  Buf bytes. The O
2eb90 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70  S layer should p
2eba0 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62  opulate the.** b
2ebb0 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c  uffer with a nul
2ebc0 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d  -terminated UTF-
2ebd0 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20  8 encoded error 
2ebe0 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72  message.** descr
2ebf0 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49  ibing the last I
2ec00 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  O error to have 
2ec10 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20  occurred within 
2ec20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74  the calling.** t
2ec30 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  hread..**.** If 
2ec40 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2ec50 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66  e is too large f
2ec60 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  or the supplied 
2ec70 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68  buffer,.** it sh
2ec80 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
2ec90 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  d. The return va
2eca0 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45  lue of xGetLastE
2ecb0 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rror.** is zero 
2ecc0 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
2ecd0 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
2ece0 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
2ecf0 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
2ed00 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
2ed10 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
2ed20 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  . If non-zero is
2ed30 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68   returned,.** th
2ed40 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  en it is not nec
2ed50 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64  essary to includ
2ed60 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  e the nul-termin
2ed70 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a  ator character.*
2ed80 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  * in the output 
2ed90 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  buffer..**.** No
2eda0 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65  t supplying an e
2edb0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
2edc0 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73  l have no advers
2edd0 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53  e effect.** on S
2ede0 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e  QLite. It is fin
2edf0 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70  e to have an imp
2ee00 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
2ee10 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e   never.** return
2ee20 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2ee30 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  ge:.**.**   int 
2ee40 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
2ee50 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2ee60 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2ee70 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61  *zBuf){.**     a
2ee80 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27  ssert(zBuf[0]=='
2ee90 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74  \0');.**     ret
2eea0 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  urn 0;.**   }.**
2eeb0 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61  .** However if a
2eec0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2eed0 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20  is supplied, it 
2eee0 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72  will be incorpor
2eef0 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  ated.** by sqlit
2ef00 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  e into the error
2ef10 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62   message availab
2ef20 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75  le to the user u
2ef30 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
2ef40 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62  errmsg(), possib
2ef50 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72  ly making IO err
2ef60 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65  ors easier to de
2ef70 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
2ef80 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
2ef90 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2efa0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2efb0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 44  char *zBuf){.  D
2efc0 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
2efd0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55 4e 55  stError();.  UNU
2efe0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2eff0 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75 66 3e  fs);.  if( nBuf>
2f000 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74 45 72  0 ) winGetLastEr
2f010 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66 2c 20  rorMsg(e, nBuf, 
2f020 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  zBuf);.  return 
2f030 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  e;.}../*.** Init
2f040 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
2f050 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
2f060 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
2f070 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
2f080 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
2f090 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
2f0a0 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
2f0b0 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0d0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
2f0e0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
2f0f0 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a  le),       /* sz
2f100 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
2f110 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
2f120 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
2f130 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2f140 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2f150 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
2f160 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
2f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f180 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77   zName */.    &w
2f190 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20 20 20  inAppData,      
2f1a0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2f1b0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f1d0 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2f1e0 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2f1f0 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2f200 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2f210 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2f220 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
2f230 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2f240 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  ,       /* xFull
2f250 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2f260 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2f270 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
2f280 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
2f290 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
2f2a0 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
2f2b0 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
2f2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f2d0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2f2e0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2f2f0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2f300 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2f310 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ss,         /* x
2f320 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2f330 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2f340 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2f350 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2f360 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20  rentTime,       
2f370 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2f380 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
2f390 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  stError,       /
2f3a0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2f3b0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2f3c0 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a  tTimeInt64,   /*
2f3d0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
2f3e0 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
2f3f0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2f400 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
2f410 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
2f420 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2f430 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2f440 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2f450 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f460 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2f470 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20  all */.  };.#if 
2f480 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2f490 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2f4a0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2f4b0 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56  vfs winLongPathV
2f4c0 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4e0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2f4f0 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2f500 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73  ile),       /* s
2f510 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2f520 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
2f530 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2f540 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2f550 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2f560 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2f570 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c   */.    "win32-l
2f580 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 20 20 2f  ongpath",      /
2f590 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26  * zName */.    &
2f5a0 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20 20  winAppData,     
2f5b0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
2f5c0 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
2f5d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f5e0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2f5f0 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2f600 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2f610 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2f620 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
2f630 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2f640 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2f650 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c  e,       /* xFul
2f660 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2f670 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2f680 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2f690 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2f6a0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
2f6b0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2f6c0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2f6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2f6e0 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
2f6f0 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
2f700 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
2f710 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
2f720 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
2f730 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2f740 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2f750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2f760 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2f770 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2f780 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2f790 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2f7a0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
2f7b0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2f7c0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2f7d0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f  ntTimeInt64,   /
2f7e0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2f7f0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2f800 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f810 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2f820 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2f830 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f840 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
2f850 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
2f860 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
2f870 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
2f880 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e  Call */.  };.#en
2f890 64 69 66 0a 20 20 73 74 61 74 69 63 20 73 71 6c  dif.  static sql
2f8a0 69 74 65 33 5f 76 66 73 20 77 69 6e 4e 6f 6c 6f  ite3_vfs winNolo
2f8b0 63 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c  ckVfs = {.    3,
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8d0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
2f8e0 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
2f8f0 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f  inFile),       /
2f900 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2f910 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
2f920 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2f930 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2f940 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2f950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2f960 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2f970 32 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20  2-none",        
2f980 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2f990 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44    &winNolockAppD
2f9a0 61 74 61 2c 20 20 20 20 20 2f 2a 20 70 41 70 70  ata,     /* pApp
2f9b0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2f9c0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2f9d0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
2f9e0 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
2f9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
2fa00 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
2fa10 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
2fa20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
2fa30 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
2fa40 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78  name,       /* x
2fa50 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
2fa60 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
2fa70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2fa80 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2fa90 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2faa0 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2fab0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fad0 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2fae0 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2faf0 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2fb00 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2fb10 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20  omness,         
2fb20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
2fb30 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
2fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb50 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
2fb60 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
2fb70 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
2fb80 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
2fb90 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
2fba0 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
2fbb0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
2fbc0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
2fbd0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2fbe0 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2fbf0 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2fc00 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74       /* xSetSyst
2fc10 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2fc20 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2fc30 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74       /* xGetSyst
2fc40 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2fc50 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2fc60 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73       /* xNextSys
2fc70 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2fc80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2fc90 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2fca0 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  E).  static sqli
2fcb0 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50  te3_vfs winLongP
2fcc0 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20 7b  athNolockVfs = {
2fcd0 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
2fce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
2fcf0 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
2fd00 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
2fd10 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c        /* szOsFil
2fd20 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  e */.    SQLITE_
2fd30 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
2fd40 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e  YTES, /* mxPathn
2fd50 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd70 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2fd80 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74    "win32-longpat
2fd90 68 2d 6e 6f 6e 65 22 2c 20 2f 2a 20 7a 4e 61 6d  h-none", /* zNam
2fda0 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f 6c  e */.    &winNol
2fdb0 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20 20 20  ockAppData,     
2fdc0 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2fdd0 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2fde0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
2fdf0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
2fe00 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ete,            
2fe10 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
2fe20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
2fe30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
2fe40 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46  cess */.    winF
2fe50 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
2fe60 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
2fe70 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
2fe80 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2fe90 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
2fea0 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
2feb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2fec0 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2fed0 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2fee0 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2fef0 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2ff00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ff10 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2ff20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2ff30 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2ff40 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
2ff50 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2ff60 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
2ff70 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2ff80 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ime,        /* x
2ff90 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
2ffa0 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72     winGetLastErr
2ffb0 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65  or,       /* xGe
2ffc0 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
2ffd0 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2ffe0 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72  Int64,   /* xCur
2fff0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
30000 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
30010 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78  mCall,      /* x
30020 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
30030 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
30040 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78  mCall,      /* x
30050 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
30060 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
30070 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78  emCall,     /* x
30080 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
30090 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20  /.  };.#endif.. 
300a0 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b   /* Double-check
300b0 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61   that the aSysca
300c0 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62  ll[] array has b
300d0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  een constructed.
300e0 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
300f0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33   See ticket [bb3
30100 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20  a86e890c8e96ab] 
30110 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  */.  assert( Arr
30120 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
30130 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20 67 65  ==80 );..  /* ge
30140 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
30150 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
30160 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
30170 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
30180 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
30190 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  FO));.#if SQLITE
301a0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65  _OS_WINRT.  osGe
301b0 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
301c0 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
301d0 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
301e0 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
301f0 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nfo);.#endif.  a
30200 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
30210 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
30220 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20  anularity>0 );. 
30230 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
30240 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30  nfo.dwPageSize>0
30250 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   );..  sqlite3_v
30260 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
30270 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65  Vfs, 1);..#if de
30280 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
30290 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
302a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
302b0 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68  ter(&winLongPath
302c0 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  Vfs, 0);.#endif.
302d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
302e0 65 67 69 73 74 65 72 28 26 77 69 6e 4e 6f 6c 6f  egister(&winNolo
302f0 63 6b 56 66 73 2c 20 30 29 3b 0a 0a 23 69 66 20  ckVfs, 0);..#if 
30300 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
30310 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
30320 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
30330 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61  ister(&winLongPa
30340 74 68 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30 29 3b  thNolockVfs, 0);
30350 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
30360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
30370 0a 20 20 77 69 6e 42 69 67 4c 6f 63 6b 20 3d 20  .  winBigLock = 
30380 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
30390 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
303a0 54 41 54 49 43 5f 56 46 53 31 29 3b 0a 23 65 6e  TATIC_VFS1);.#en
303b0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
303c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20  LITE_OK;.}..int 
303d0 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
303e0 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  oid){.#if SQLITE
303f0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
30400 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
30410 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
30420 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20  dle(sleepObj);. 
30430 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55     sleepObj = NU
30440 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  LL;.  }.#endif..
30450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30460 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 42 69 67  MIT_WAL.  winBig
30470 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Lock = 0;.#endif
30480 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
30490 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
304a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
304b0 20 2a 2f 0a                                       */.